基礎(chǔ)疑問:handler的思考

推薦:

https://www.zhihu.com/question/44329366

1.handler設(shè)計是用來做什么的?

線程間通信。告知數(shù)據(jù)更新。


2.handler底層通信方式是什么?

管道。跨進(jìn)程的管道被用于跨線程通信。據(jù)說android 2.3之前是使用java的wait notify機(jī)制。原因猜測,效率更高。

3.handler為什么不用binder?

未知。可能效率問題。

4.主線程給自己發(fā)送消息,如果后面還有代碼要執(zhí)行,是先處理消息,還是會執(zhí)行完后面的代碼呢?

例如

mhandler.sendMessage();

a=1;

method1();


是會先執(zhí)行完后面的代碼段a=1

和 method1,為什么?因為消息處理是有順序的,只有執(zhí)行完當(dāng)前消息,才會處理下一個消息。所以消息處理是串行的方式。

5.handler大致工作流程是怎樣的?

有4大主體,

handler,messagequeue,message,looper。looper執(zhí)行messagequeue.next從消息隊列取消息,如果沒有消息,則阻塞在管道的讀端nativepollonce方法。nativepollonce基于管道通信的方式。

這時handler往消息隊列messagequeue插入消息message,其實(shí)就是在管道寫端寫數(shù)據(jù)。這時讀端就有數(shù)據(jù)了,nativepollonce函數(shù)返回,消息到達(dá),然后就觸發(fā)了消息的處理。消息處理完成后再次阻塞在管道的讀端nativepollonce方法,等待新一輪消息到達(dá)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容