1. 程式人生 > >【Android自助餐】Handler訊息機制完全解析(五)鳥瞰與總結

【Android自助餐】Handler訊息機制完全解析(五)鳥瞰與總結

Android自助餐Handler訊息機制完全解析(五)鳥瞰與總結

Message

用於傳送的訊息本身。常用欄位有whatobj等。這裡沒什麼好說的,無非是一些訊息內容及其getter、setter。要說有點營養的就是那些botain()方法了,具體內容可以看Message中obtain()與recycle()的來龍去脈

來了解。

MessageQueue

用於管理Message,比如新增、讀取、移除等。詳細分析可以看MessageQueue的佇列管理來了解。

Handler

主要有建立訊息、傳送訊息、移除訊息、處理訊息。詳細分析可以看Handler解析來了解。

Looper

loop()方法封裝成物件,並將物件儲存到執行緒的ThreadLocal中,主要是在loop()的死迴圈中從訊息佇列取訊息並回調Handler處理。詳細分析可以看Looper解析來了解。

總結

  1. 一個應用啟動過程中會在主執行緒中呼叫ActivityThread.main(),從而呼叫Looper.prepareMainLooper()
    Looper.loop()。前者會建立訊息佇列並記錄當前執行緒,隨後將looper本身放到執行緒儲存ThreadLocal中。後者則無限迴圈的從訊息佇列中獲取訊息並處理。
  2. 建立Handler時會從執行緒儲存ThreadLocal中獲取looper並記錄,然後從looper中獲取訊息佇列並記錄。
  3. 呼叫handler的obtainMessage()時會將當前handler放到訊息的target中記錄下來。
  4. 呼叫handler的sendMessage()方法會將訊息新增到從looper獲取的訊息佇列中。
  5. 當looper的loop()方法從訊息佇列取到訊息時,就呼叫message.target.dispatchMessage()
    來分發到message記錄的handler中進行處理。
  6. 向訊息佇列放訊息時,如果沒有指定時間,則設定其when為當前時間,然後放到連結串列儲存,如果執行緒阻塞則喚醒執行緒。
  7. 從訊息佇列取訊息時,如果佇列不為空且隊頭訊息的when不晚與當前時間,則從連結串列中取出並返回該訊息,否則執行緒阻塞。