[轉]Android Message.obtain() 和Handler.obtainMessage()的區別


 

 

 
 

目錄(?)[+]

 

參考:http://www.2cto.com/kf/201311/255885.html

http://www.cnblogs.com/over140/archive/2011/06/24/2088637.html

 

 

    

 

 

類概述

 

定義一個包含任意類型的描述數據對象,此對象可以發送給Handler。對象包含兩個額外的int字段和一個額外的對象字段,這樣可以使得在很多情況下不用做分配工作。

盡管Message的構造器是公開的,但是獲取Message對象的最好方法是調用Message.obtain()或者Handler.obtainMessage(), 這樣是從一個可回收對象池中獲取Message對象。

 

1、首先創建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.     };  
 

2、然后是消息處理:

[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對象就能避免創建對象,從而減少內存的開銷了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM