发布网友 发布时间:2022-04-22 05:21
共5个回答
热心网友 时间:2023-07-09 23:05
Message是一个类,而obtainMessage是这个类里的一个方法。
Message用于封装传递给Handler或者别的什么东西的信息,而obtainMessage则是用于获取一个空白的Message实例。出于节省内存和提高效率的考虑,创建Message实例时,应当尽可能使用obtainMessage,而非使用new关键字去新建Message实例。
Message与obtainMessage的区别涉及到Java中关于类和方法的概念,也是面向对象的逻辑方法的基本概念:
事物根据其基本属性和功能可以划分为不同的分类,任何具体的事物都是从属于一个或多个类的实体。在面向对象编程中,根据事物的属性和功能所划分出来的分类就是“类”(Class),该类所具有的各项属性被称为“域”(Field),而其具有的各项功能就被称为“方法”(Method)。给一个类中的域赋予具体的值之后,就可以得到该类的一个具体的实例。
总而言之,就Message和obtainMessage的关系,是obtainMessage从属于Message,用来实现Message中的一个功能的方法而已
热心网友 时间:2023-07-09 23:05
我想你说的区别应该是指:Message在使用时是new Message(),obtainMessage在使用时是handler.obtainMessage()吧。一个比较好理解的区别是obtainMessage不需要重新new出对象,而是直接取自消息池,节省了内存开销;另外一个重要的用法是,涉及到自定义thread时,建议使用obtainMessage,因为使用message可能会导致null异常或其他异常。
热心网友 时间:2023-07-09 23:06
obtainMessage会比较快
原因是obtainMessage获得的Message 不是new出来的,而是从MessagePool 拿的,省去了创建对象申请内存的开销。
尽管Message的构造器是公开的,但是获取Message对象的最好方法是调用Message.obtain()或者Handler.obtainMessage(), 这样是从一个可回收对象池中获取Message对象。
热心网友 时间:2023-07-09 23:06
1.obtain方法的注释中说得很明白:从整个Messge池中返回一个新的Message实例,在许多情况下使用它,因为它能避免分配新的对象
2.那么通过调用obtainMessage方法获取Message对象就能避免创建对象,从而减少内存的开销了。
3.具体见:
平时我在处理消息时:
1、首先创建Handler对象:
private Handler handler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
break;
default:
break;
}
};
};
2、然后是消息处理:
private void TestHandlerMessage(){
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
}
但是我看别人源码部分是是这样处理的:
1、首先创建Handler对象:
private Handler handler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
break;
default:
break;
}
};
};
2、然后是消息处理:
private void obtainMessageTest(){
Message msg = handler.obtainMessage();
msg.what = 1;
handler.sendMessage(msg);
}
通过比较我们会发现,这两种获取Message的实例的方法不一样,于是我看了源码,果然不一样:
查看obtainMessage()源码:
图1:
进入obtain方法:
图2:
再进入objtain方法:
图3:
进入Message方法:
图4:
热心网友 时间:2023-07-09 23:07
handler.obtainMessage()是从message池中返回一个对象,如果池中没有就新建一个。
new Message()直接新建一个。handler.obtainMessage()会节省内存开销。