Android的消息機制

 一、消息機制簡介
 1.Android的消息機制主要是指Handler的運行機制,Handler的運行需要底層MessageQueue和Looper的支撐。
 2.MessageQueue是採用單鏈表的數據結構來存儲消息列表。
 3.Looper會以無限循環的形式去查看是否有新消息,如果有就處理消息,否則就一直等待。
 4.ThreadLocal可以在不同線程中互不干擾的存儲並提供數據,通過ThreadLocal可以輕鬆的獲取每個線程的Looper。

二、Android的消息機制分析
2.1 ThreadLocal的工作原理

1.  ThreadLocal是一個線程內部的數據存儲類,通過它可以在指定線程存儲數據,數據存儲後,只能在指定的線程可以獲取到存儲的數據,對於其他線程則無法獲取到數據。一般來說,當數據是以線程作爲作用域並且不同線程有不同副本的時候,就可以考慮使用ThreadLocal。對於Handler來說,它需要獲取當前線程的Looper,而Looper的作用於就是線程並且不同的線程具有不同的Looper,通過ThreadLocal可以輕鬆實現線程中的存取。
2. ThreadLocal的另一個使用場景是複雜邏輯下的對象傳遞。
3.  ThreadLocal原理:不同線程訪問同一個ThreadLoacl的get方法,ThreadLocal的get方法會從各自的線程中取出一個數組,然後再從數組中根據當前ThreadLocal的索引去查找對應的Value值。

2.2 消息隊列的工作原理

  1. MessageQueue主要有兩個操作,插入和讀取,讀取操作伴隨着刪除操作;MessageQueue是通過單鏈表的數據結構來維護消息列表的。
  2. enqueueMessage方法的作用是往消息隊列插入一條消息。next方法是一個無線循環的方法,如果消息隊列中沒有消息,那麼next方法會一直阻塞在這裏。當有新消息到來時,next方法會返回這條消息並將其從單鏈表中移除。

2.3 Looper的工作原理

  1. prepareMainLooper方法主要給主線程也就是ActivityThread創建Looper使用的,本質也是通過prepare方法實現的。
  2. Looper提供quit和quitSafely來退出一個Looper,區別在於quit會直接退出Looper,而quitSafely會把消息隊列中已有的消息處理完畢後才安全地退出。
    Looper退出後,這時候通過Handler發送的消息會失敗,Handler的send方法會返回false。
    在子線程中,如果手動爲其創建了Looper,在所有事情做完後,應該調用Looper的quit方法來終止消息循環,否則這個子線程就會一直處於等待狀態;而如果退出了Looper以後,這個線程就會立刻終止,因此建議不需要的時候終止Looper。
  3. loop方法會調用MessageQueue的next方法來獲取新消息,而next是是一個阻塞操作,但沒有信息時,next方法會一直阻塞在那裏,這也導致loop方法一直阻塞在那裏。如果MessageQueue的next方法返回了新消息,Looper就會處理這條消息:mas.target.dispatchMessage(msg),這裏的msg.target是發送這條消息的Handler對象,這樣Handler發送的消息最終又交給Handler來處理了。

2.4 Handler的工作原理

這裏寫圖片描述

發佈了20 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章