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

类概述

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

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


一、首先建立Handler对象:

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  1. private Handler mHandler = new Handler() {  
  2.   
  3.         public void handleMessage(android.os.Message msg) {  
  4.             switch (msg.what) {  
  5.             case 1:  
  6.                 textShowTV.setText("展现中...");  
  7.                 break;  
  8.             }  
  9.         };  
  10.           
  11.     };  

 

二、而后是消息处理:

[java] view plain copy 在CODE上查看代码片 派生到个人代码片
  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:

 

进入Message方法:


图2:

 
 

查看obtainMessage()源码:

 
图3:

   

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

图4:


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


总结:

 
上面的图1中obtain方法的注释中说得很明白:从整个Messge池中返回一个新的Message实例,在许多状况下使用它,由于它能避免分配新的对象
 
若是是这人的话,那么经过调用obtainMessage方法获取Message对象就能避免建立对象,从而减小内存的开销了。
 
note:转自http://blog.csdn.net/duqiuke/article/details/39577413
相关文章
相关标签/搜索