推薦:
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á)。