Handler,Looper,MessageQueue簡析

Handler的構造函數:
通過Looper.myLooper()獲取Looper對象
檢測Looper對象是否爲null (主要是看是否調用過Looper.prepare())
從Looper對象中獲取MessageQueue
Handler的sendMessage():
最終調用sendMessageAtTime(),實質內容就是通過enqueueMessage()方法把msg放入MessageQueue中

MessageQueue的enqueueMessage()方法:
就是一個鏈表的數據結構,把最新傳入的msg插入到鏈表尾部
MessageQueue的next()方法:
一個死循環
nativePullOnce()會阻塞(當沒有消息(沒有消息,nextPullTimeoutMillis=-1,在native中依據nextPullTimeoutMillis來決定是否返回),或者沒有到發送時間時阻塞)
喚醒時機有2個:
隊列中加入新的msg,也就是enqueueMessage()時候,需要判斷是否需要喚醒
超時

Looper解析:
構造函數:創建MessageQueue實例, 並通過Thread.currentThread()獲取並綁定當前線程
prepare()方法:創建Looper對象,並通過ThreadLocal保存
myLooper()方法:從ThreadLocal中獲取Looper對象.若沒有調用過prepare()方法,則返回null

loop()方法:
仍然會通過myLooper()獲取looper對象,並判斷是否爲空.
工作在死循環中.
通過queue.next()獲取msg,這裏會阻塞.
判斷msg是否爲空來決定是否退出死循環,因此Looper的quit()方法,就是調用MessageQueue的quit()方法,而MessageQueue的quit()方法就是清除所有的msg.
msg.target就是handler的實例了,調用其dispatchMessage(msg)方法,交由handler來處理事件.

prepareMainLooper()方法:創建主線程的Looper,不應該手動調用.在ActivityThread中調用
getMainLooper()方法:返回應用的主線程Looper

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章