開發藝術探索 -- Android中的消息機制

第十章,Android中的消息機制

消息機制概述
消息機制分析
主線程的消息循環

之前的總結 關於Android中的Handler 機制

消息機制概述

  1. Android消息機制的上層接口就是Handler.
  2. Handler需要MessageQueue,Looper做支撐.
  3. Handler創建的時候會採用當前線程的Looper,涉及到ThreadLocal
  4. Handler的作用是將一個任務切換到指定的線程執行
  5. ViewRootImpl#checkThread會對ui操作進行驗證.
  6. 爲甚不能再子線程訪問ui(Android ui單線程模型,防止ui訪問邏輯複雜和效率低下)

消息機制分析

  1. ThreadLocal是一個線程內部的數據存儲類
  2. MessageQueue包含插入讀取操作,插入本身會伴隨着刪除操作
  3. 插入讀取分別對應着enqueueMessagenext方法
  4. MessageQueue並不是隊列數據結構,而是一個單鏈表
  5. Looper扮演着消息循環的角色,不停地查看MessageQueue中是否有新消息
  6. Looper.prepare即可爲當前線程創建Looper,通過Looper.loop即可開啓循環
  7. prepareMainLooper是爲主線程ActivityThread創建Looper
  8. Looper提供了quit(立即退出) 和 quitSafely(消息執行完安全退出) 來退出一個Looper
  9. Looper退出後,sendMessage返回false,發送消息失敗.
  10. 在子線程中創建的 Looper,建議不需要時 手動退出
  11. Looper#quit調用後MessageQueue#next返回null,跳出循環.

Handler工作原理

Handler發送一條消息,則MessageQueuenext就會返回這條消息的Looper,Looper接到消息後就會調用Handler#dispatchMessage來處理消息了.

Handler處理消息的過程:

  1. 檢查 message.callback 是否爲null,不爲null,則handleCallback
  2. 檢查 mCallBack 是否爲null,不爲 null,則調用mCallBack.handleMessage
  3. mCallBack.handleMessage返回false或者沒有沒有mCallBack,調用 Handler#handleMessage

通過CallBack創建Handler可以創建一個Handler實例,而不用派生Handler的子類

主線程的消息循環

  1. Android中的主線程就是ActivityThread,入口是main,其會調用Looper.prepareMainLooper來創建主線程的LooperMessageQueue,並通過Looper.loop來開啓消息循環.
  2. 主線程消息循環開啓後, ActivityThread還會開啓一個ActivityThread.HHandler來和消息隊列進行交互.ActivityThread.H內部還定義了四大組件啓動和停止相關消息.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章