導航:首頁 > 操作系統 > android中的message

android中的message

發布時間:2022-12-11 04:17:05

A. android message對象的問題

線程中:
java">Messagemsg=Message.obtain();
msg.obj=result1;//從這里把你想傳遞的數據放進去就行了
handler.sendMessage(msg);
線程外:

Handlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
StringgetResult1=(String)msg.obj;
}
};

B. Android Message和obtainMessage的區別

在android中,Message 是一個對象,而obtainMessage是一個方法,返回值時一個message對象(從消息池獲取,不需new 個對象)。從性能上來說,建議用
obtainMessage方法獲取message對象,可以節省內存的消耗

C. Android Message和obtainMessage的區別

Message是一個消息對象,Message.obtain();是從消息隊列中取一個空消息,目的是節省new 帶來的內存開消。android也建議使用Message.obtain()來獲取Message實例。

D. Android開發中Message類的what相關問題

你的代碼都不是在一個方法里
低級的語法錯誤!!

另外,android中不建議直接new Message 而是調用Message.obtain();
來創建一個Message 不信你自己看看Message 構造方法的說明!!

E. android這樣創建Message可以減少內存開銷

我們一般創建message是這么創建的

Message msg = new Message();

但是這樣創建message可以減少內存開銷

Message msg = handler.obtainMessage();

為什麼會這樣呢?我們來看看源碼,關鍵源碼如下:

//普通的實例化方法

public Message(){}

//obtainMessages實例化方法

public final Message obtainMessage(){

      return Message.obtain(this);

}

public static Message obtain(Handler h){

Message m=obtain();

m.target=h;

return m;

}

public static Message obtain(){

synchronized(sPoolSync){

Message m=sPool;

sPool=m.next;

m.next=null;

sPoolSize--;

return m;

}

return new Message();

}

總結:

上面源碼中說得很明白:從整個Messge池中返回一個新的Message實例,在許多情況下使用它,因為它能避免分配新的對象

如果是這人的話,那麼通過調用obtainMessage方法獲取Message對象就能避免創建對象,從而減少內存的開銷了。

F. Android Message和obtainMessage的區別

obtainMessage會比較快
原因是obtainMessage獲得的Message 不是new出來的,而是從MessagePool 拿的,省去了創建對象申請內存的開銷。
盡管Message的構造器是公開的,但是獲取Message對象的最好方法是調用Message.obtain()或者Handler.obtainMessage(), 這樣是從一個可回收對象池中獲取Message對象。

G. 詳解Android消息機制之Message

在分析Message這個類之前,有必要先看看它的類注釋其中有這么一段話:

從這段話得知,盡管Message本身的構造方式是公共的,但實現Message對象的最好方法確實是通過Message.obtain()函數返回,或者通過Handler.obtainMessage()方法,查看其最終還是調用了obtain函數。

如果使用new來實現我們初步的推測,應該是會構建大量的Message對象,對內存有一定的影響。
在這還是先看一下谷歌給這個函數的注釋:

從obtain函數的注釋中也能看出其作用就是用避免大量的構建Message對象,但它是究竟是如何處理的呢?帶著疑問查看obtain函數:

實現很簡單:

但看到這里還是很模糊,雖然sPool看上去像一個消息池,但再仔細看居然是一個Message對象,這樣真的就能避免多次構建Message對象嗎?繼續看會發現一個next欄位,再看它的注釋 sometimes we store linked lists of these things ,Message的消息池原來是一個鏈表,如下圖所示 。

每一個Message 對象通過next指向下一個Message(最後一個Message的next為null)形成一個鏈表,Message對象就成了一個可用的Message池。

到這終於知道Message對象原來是從鏈表中獲取的,但還有一個疑問:Message對象是什麼時候放入鏈表中的呢?從obtain函數並沒有看見存儲Message的操作。這時候又要回到文章開頭的那段類注釋的最後一句話: which will pull them from a pool of recycled objects。
消息池是一些回收的對象,也就是說Message對象是在回收的時候將其添加到鏈表中的。通過查看在Message中有個recycle方法:

在recycleUnchecked函數中會先清空該消息的各個欄位,並且把flags設置為FLGA_IN_USE,表明該消息已經被使用了。然後判斷是否要將消息回收到消息池中,如果池的大小小於MAX_POOL_SIZE,就將自身添加到鏈表的表頭,sPoolSize++。
例如最開始的開始的時候鏈表中沒有任何消息,將第一個Message對象添加到表中,此時的sPool為空,因此next也為空,sPool又指向this,這時sPool就指向當前這個被回收的Message對象,sPoolSize加1。我們把這個Message命名為m1,這時的鏈表應該如下:

如果再次插入一個名為m2的Message,那麼m2將被插入表頭,sPool指向m2,這時sPool的鏈表中結構如下:

對象池默認的大小為50,如果池的大小小於50,被回收的消息將會被插入到鏈表頭部。

如果池中有元素,這時候再調用obtain函數時,實際上是就獲取鏈表中表頭的元素,也就是sPool。再把sPool指針往後移動一個。在obtain漢中,首先會聲明一個Message對象m,並且讓m指向sPool.sPool實際上指向了m2,因此m實際上指向的也是m2,這里相當於保持了m2這個元素。下一步是sPool指向m2的下一個元素,也就是m1。sPool也完成後移之後此時把m.next置空,也就相當於m2.next變成了null。最後就是m指向了m2元素,m2的next為空,sPool從原來的表頭m2指向了下一個元素m1,最後將對象的元素減1,這樣m2就順利的脫離了消息池隊伍,就返回給了調用obtain函數的。

H. Android Message和obtainMessage的區別

new message 就是生成一個新的message ,obtainMessage是從當前handler持有的消息隊列中拿一個空閑的消息出來用 好處是你可以節省資源 而且這個消息對象中是可以拿到目標target 也就是持有他的handler 當然 如果你obtainMessage的時候 hander持有的消息隊列裡面沒有空閑的消息 也是幫你new出來一個

閱讀全文

與android中的message相關的資料

熱點內容
上架一個伺服器要做什麼 瀏覽:854
創立文件夾命令 瀏覽:252
單片機移位寄存器 瀏覽:6
java程序設計及實訓教程 瀏覽:335
redis有序集合演算法 瀏覽:778
java獲取最大值 瀏覽:74
linux硬體配置命令 瀏覽:948
java6webservice 瀏覽:450
硬體加密的未來發展趨勢 瀏覽:589
釘釘上文件夾怎麼做 瀏覽:277
編譯動物之塔 瀏覽:613
玩嘻哈必下的app在哪裡下 瀏覽:210
談談如何給文件夾或文件加密 瀏覽:37
螺桿式壓縮機溫度計 瀏覽:706
gnu編譯器pdf 瀏覽:463
稀有程序員圖片 瀏覽:43
linux系統有哪些版本的 瀏覽:149
黑月編譯器優缺點 瀏覽:685
線刷包為啥要解壓 瀏覽:149
伺服器滑道怎麼安裝 瀏覽:700