android Handler.btionMessage()与Message.obtain()的区别

时间:2022-05-02 18:32:38

类概述

定义一个包含任意类型的描述数据对象,此对象可以发送给Handler。对象包含两个额外的int字段和一个额外的对象字段,这样可以使得在很多情况下不用做分配工作。

尽管Message的构造器是公开的,但是获取Message对象的最好方法是调用Message.obtain()或者Handler.obtainMessage(), 这样是从一个可回收对象池中获取Message对象。

1、首先创建Handler对象:

  1. private Handler mHandler = new Handler() {
  2. public void handleMessage(android.os.Message msg) {
  3. switch (msg.what) {
  4. case 1:
  5. textShowTV.setText("展示中...");
  6. break;
  7. }
  8. };
  9. };

2、然后是消息处理:

  1. //①,使用new Message()
  2. //          Message mess = new Message();
  3. //②,使用Message.obtain()
  4. Message mess = Message.obtain();
  5. mess.what =1;
  6. //mHandler.obtainMessage(1)与上两行的代码一样,可以参考源码查看
  7. //          Message mess = mHandler.obtainMessage(1);
  8. mHandler.sendMessage(mess);
通过比较我们会发现,这两种获取Message的实例的方法不一样,于是我看了源码,果然不一样:

进入obtain方法:

图1:
android Handler.btionMessage()与Message.obtain()的区别

进入Message方法:

图2:
android Handler.btionMessage()与Message.obtain()的区别

查看obtainMessage()源码:

图3:
android Handler.btionMessage()与Message.obtain()的区别

查看Message.obtain(this, what) 源码:

图4:
android Handler.btionMessage()与Message.obtain()的区别

然后,再次点击obtain() 方法,代码又回归到了图1

总结:

上面的图1中obtain方法的注释中说得很明白:从整个Messge池中返回一个新的Message实例,在许多情况下使用它,因为它能避免分配新的对象
如果是这人的话,那么通过调用obtainMessage方法获取Message对象就能避免创建对象,从而减少内存的开销了。
note:转自http://blog.csdn.net/duqiuke/article/details/39577413