【Android自助餐】Handler訊息機制完全解析(五)鳥瞰與總結
阿新 • • 發佈:2018-12-05
Android自助餐Handler訊息機制完全解析(五)鳥瞰與總結
Message
用於傳送的訊息本身。常用欄位有what
、obj
等。這裡沒什麼好說的,無非是一些訊息內容及其getter、setter。要說有點營養的就是那些botain()
方法了,具體內容可以看Message中obtain()與recycle()的來龍去脈
MessageQueue
用於管理Message,比如新增、讀取、移除等。詳細分析可以看MessageQueue的佇列管理來了解。
Handler
主要有建立訊息、傳送訊息、移除訊息、處理訊息。詳細分析可以看Handler解析來了解。
Looper
將loop()
方法封裝成物件,並將物件儲存到執行緒的ThreadLocal
中,主要是在loop()
的死迴圈中從訊息佇列取訊息並回調Handler
處理。詳細分析可以看Looper解析來了解。
總結
- 一個應用啟動過程中會在主執行緒中呼叫
ActivityThread.main()
,從而呼叫Looper.prepareMainLooper()
Looper.loop()
。前者會建立訊息佇列並記錄當前執行緒,隨後將looper本身放到執行緒儲存ThreadLocal
中。後者則無限迴圈的從訊息佇列中獲取訊息並處理。 - 建立Handler時會從執行緒儲存
ThreadLocal
中獲取looper並記錄,然後從looper中獲取訊息佇列並記錄。 - 呼叫handler的
obtainMessage()
時會將當前handler放到訊息的target
中記錄下來。 - 呼叫handler的
sendMessage()
方法會將訊息新增到從looper獲取的訊息佇列中。 - 當looper的
loop()
方法從訊息佇列取到訊息時,就呼叫message.target.dispatchMessage()
- 向訊息佇列放訊息時,如果沒有指定時間,則設定其
when
為當前時間,然後放到連結串列儲存,如果執行緒阻塞則喚醒執行緒。 - 從訊息佇列取訊息時,如果佇列不為空且隊頭訊息的
when
不晚與當前時間,則從連結串列中取出並返回該訊息,否則執行緒阻塞。