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
相關文章
相關標籤/搜索