sendMessage 與 obtainMessage (sendToTarget)比較

我們平時(shí)在做到多線程問題的時(shí)候可能利用Handler去傳遞Message,其中,經(jīng)常使用的就是
1、new Handler().obtainMessage().sendToTarget();
2、new Handler().sendMessage(new Message());
第一種是直接傳遞what,obj等,msg的一些數(shù)據(jù),第二種是初始化一個(gè)msg,然后賦值msg的一些數(shù)據(jù),以Message的對(duì)象去send,在使用上這兩種都可以實(shí)現(xiàn)需求,那么這兩種有什么區(qū)別呢?廢話不多說,直接源碼走起:
先看第一種:

image.png

注意看注釋,返回了一個(gè)來自消息池的Message對(duì)象,也就是說Message.obtain返回的是一個(gè)消息池的msg對(duì)象,那么做了什么呢,繼續(xù)跟


image.png

看看注釋,就是說等同于obtain()方法,返回了一個(gè)帶target標(biāo)志的Message,就是給Message打上Handler的標(biāo)志,好區(qū)分的意思,沒別的意思,主要就是obtain()方法,如下


image.png

就如同最開始說的那樣從MessagePool 返回一個(gè)新的Message實(shí)例,避免分配新對(duì)象,省去了創(chuàng)建對(duì)象申請(qǐng)內(nèi)存的開銷。。。。。
image.png

得到了Message后,調(diào)用了sendToTarget(),,里面調(diào)用了sendMessage(),這就是和方法二一樣的了, new Handler().sendMessage(new Message());
總結(jié)下就是說利用obtainMessage().sendToTarget()是從MessagePool 返回一個(gè)新的Message實(shí)例可以避免我們?nèi)?chuàng)建Message對(duì)象申請(qǐng)內(nèi)存開銷。ok,分析完畢,如果有說的不對(duì)或者不合適的歡迎指出。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容