第十章,Android中的消息機制
消息機制概述
消息機制分析
主線程的消息循環
之前的總結 關於Android中的Handler 機制
消息機制概述
Android
消息機制的上層接口就是Handler
.Handler
需要MessageQueue,Looper
做支撐.Handler
創建的時候會採用當前線程的Looper
,涉及到ThreadLocal
Handler
的作用是將一個任務切換到指定的線程執行ViewRootImpl#checkThread
會對ui操作進行驗證.- 爲甚不能再子線程訪問ui(Android
ui單線程模型
,防止ui訪問邏輯複雜和效率低下
)
消息機制分析
ThreadLocal
是一個線程內部的數據存儲類
MessageQueue
包含插入
和讀取
操作,插入本身會伴隨着刪除操作
插入
和讀取
分別對應着enqueueMessage
和next
方法MessageQueue
並不是隊列
數據結構,而是一個單鏈表
Looper
扮演着消息循環的角色,不停地查看MessageQueue
中是否有新消息Looper.prepare
即可爲當前線程創建Looper
,通過Looper.loop
即可開啓循環prepareMainLooper
是爲主線程ActivityThread
創建Looper
的- Looper提供了
quit(立即退出) 和 quitSafely(消息執行完安全退出)
來退出一個Looper
Looper
退出後,sendMessage
返回false,發送消息失敗.- 在子線程中創建的
Looper
,建議不需要時手動退出
Looper#quit
調用後MessageQueue#next
返回null,跳出循環.
Handler工作原理
Handler
發送一條消息,則MessageQueue
的next
就會返回這條消息的Looper
,Looper
接到消息後就會調用Handler#dispatchMessage
來處理消息了.
Handler處理消息的過程:
- 檢查
message.callback
是否爲null,不爲null,則handleCallback
- 檢查
mCallBack
是否爲null,不爲 null,則調用mCallBack.handleMessage
- 當
mCallBack.handleMessage
返回false
或者沒有沒有mCallBack
,調用Handler#handleMessage
通過
CallBack
創建Handler
可以創建一個Handler
實例,而不用派生Handler
的子類
主線程的消息循環
Android
中的主線程就是ActivityThread
,入口是main
,其會調用Looper.prepareMainLooper
來創建主線程的Looper
及MessageQueue
,並通過Looper.loop
來開啓消息循環.- 主線程消息循環開啓後,
ActivityThread
還會開啓一個ActivityThread.H
的Handler
來和消息隊列
進行交互.ActivityThread.H
內部還定義了四大組件啓動和停止相關消息.