首页 养生问答 疾病百科 养生资讯 女性养生 男性养生

Android Message和obtainMessage的区别

发布网友 发布时间: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()会节省内存开销。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com