Android 消息機(jī)制深入源碼分析 [ 一 ]
Android 消息機(jī)制之 ThreadLocal 深入源碼分析 [ 二 ]
Android 消息機(jī)制之 Looper 深入源碼分析 [ 三 ]
Android 消息機(jī)制之 Message 與消息對象池的深入源碼分析 [ 四 ]
Android 消息機(jī)制之 MessageQueue 深入源碼分析 [ 五 ]
Android 消息機(jī)制之初識Handler [ 六 ]
Android 消息機(jī)制之 Handler 發(fā)送消息的深入源碼分析 [ 七 ]
Android 消息機(jī)制之 MessageQueue.next() 消息取出的深入源碼分析 [ 八 ]
Android 消息機(jī)制之消息的其他處理深入源碼分析 [ 九 ]
Android 消息機(jī)制總結(jié) [ 十 ]
本文集, 開始學(xué)習(xí) Android 的消息機(jī)制. 將全面的了解消息機(jī)制中各個(gè)組件的作用及原理.
?
在開始分析源碼之前, 需要先了解一下 Android 中消息機(jī)制的基本概念.
?
消息機(jī)制概述
Android 的消息機(jī)制主要是指 Handler 的運(yùn)行機(jī)制, Handler 的運(yùn)行需要底層的 MessageQueue 和 Looper 的支撐.
Handler 是 Android 消息機(jī)制的上層接口, 這使得在開發(fā)過程中只需要和 Handler 交互即可, Handler 的主要作用是將一個(gè)任務(wù)切換到某個(gè)指定的線程中去執(zhí)行. 因?yàn)?Android 規(guī)定訪問 UI 只能在主線程中進(jìn)行.
MessageQueue 的中文翻譯是消息隊(duì)列, 顧名思義, 它的內(nèi)部存儲(chǔ)了一組消息, 以隊(duì)列的形式對外提供插入和刪除的工作. 雖然叫消息隊(duì)列, 但是它的內(nèi)部存儲(chǔ)結(jié)果卻不是真正的隊(duì)列, 而是采用單鏈表的結(jié)構(gòu)來存儲(chǔ)消息列表.
Looper 的中文翻譯為循環(huán). 可以理解為消息循環(huán). 由于 MessageQueue 只是一個(gè)消息的存儲(chǔ)單元, 它不能去處理消息, 而 Looper 就填補(bǔ)了這個(gè)功能. Looper 會(huì)以無限循環(huán)的形式去查找是否有新的消息, 有就處理, 否則就會(huì)一直等待.
ThreadLocal: Looper 中還有一個(gè)特殊的概念,那就是 ThreadLocal, ThreadLocal 并不是線程, 它的作用是可以在每個(gè)線程中存儲(chǔ)數(shù)據(jù), Handler 創(chuàng)建的時(shí)候會(huì)采用當(dāng)前線程的 Looper 來構(gòu)造消息循環(huán)系統(tǒng), Handler 內(nèi)部就是通過 ThreadLocal 來獲取當(dāng)前線程的 Looper 的. ThreadLocal 可以再不同的線程中互不干擾的存儲(chǔ)并提供數(shù)據(jù). 通過 ThreadLocal 可以輕松獲取每個(gè)線程的 Looper, 需要注意的是, 線程默認(rèn)是沒有 Looper 的, 如果需要使用 Handler 就必須為線程創(chuàng)建 Looper.(主線程除外). 我們經(jīng)常提到的主線程, 也叫 UI 線程, 它就是 ActivityThread, ActivityThread 被創(chuàng)建時(shí)就會(huì)初始化 Looper, 這也是我們在主線程中默認(rèn)可以使用 Handler 的原因.
Handler 與 Message 內(nèi)部其實(shí)是相互持有引用的.
?
?