標籤:
目錄(?)[+]
參考:http://www.2cto.com/kf/201311/255885.htmlhttp://www.cnblogs.com/over140/archive/2011/06/24/2088637.html
類概述
定義一個包含任意類型的描述資料對象,此對象可以發送給Handler。對象包含兩個額外的int欄位和一個額外的對象欄位,這樣可以使得在很多情況下不用做分配工作。
儘管Message的構造器是公開的,但是擷取Message對象的最好方法是調用Message.obtain()或者Handler.obtainMessage(), 這樣是從一個可回收對象池中擷取Message對象。
1、首先建立Handler對象:
[java] view plaincopy
- private Handler mHandler = new Handler() {
-
- public void handleMessage(android.os.Message msg) {
- switch (msg.what) {
- case 1:
- textShowTV.setText("展示中...");
- break;
- }
- };
-
- };
2、然後是訊息處理:
[java] view plaincopy
- //①,使用new Message()
- // Message mess = new Message();
- //②,使用Message.obtain()
- Message mess = Message.obtain();
- mess.what =1;
- //mHandler.obtainMessage(1)與上兩行的代碼一樣,可以參考源碼查看
- // Message mess = mHandler.obtainMessage(1);
- mHandler.sendMessage(mess);
通過比較我們會發現,這兩種擷取Message的執行個體的方法不一樣,於是我看了源碼,果然不一樣: 進入obtain方法: 圖1: 進入Message方法: 圖2: 查看obtainMessage()源碼: 圖3: 查看Message.obtain(this, what) 源碼:圖4: 然後,再次點擊obtain() 方法,代碼又迴歸到了圖1 總結: 上面的圖1中obtain方法的注釋中說得很明白:從整個Messge池中返回一個新的Message執行個體,在許多情況下使用它,因為它能避免分配新的對象 如果是這樣的話,那麼通過調用obtainMessage方法擷取Message對象就能避免建立對象,從而減少記憶體的開銷了。
[轉]Android Message.obtain() 和Handler.obtainMessage()的區別