Loop,Handler,Message的原始碼解析
一.Looper
1.Loop的概述
主要是講訊息從訊息佇列中取出來,然後交給與message相對應的Handler處理。
2.Loop的屬性
Thread<Local>:為每個執行緒建立一個副本 就是建立一個Loop線上程裡面。 --set(Looper) 建立Looper的副本 ---get()獲取Looper
MessageQueue:訊息佇列 --主要用來儲存訊息
Thread ---獲取當前的執行緒
3.Loop的方法
prepare():初始化屬性
myLooper():獲取當前執行緒的Looper
loop:迴圈從訊息佇列中取出訊息交給Handler
二.Handler
1.Handler的概述
將message和runnable傳送出去並在未來某個時間處理
將要在不同執行緒上執行的操作放在佇列裡面 。 --一個Handler建立需要繫結 當前執行緒和其訊息佇列
2.Handler處理message的方法
/** * Handle system messages here. */ public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); } }
從上面程式碼可以看出,Handler處理訊息的機制。 先判斷message.callback是否為空,不為空則執行message.callback
在判斷 執行訊息的Handler是否實現了CallBack介面,如果實現了就執行handler.mCallback.handleMessage方法,
我們可以設定返回值來選擇是否需要執行handler.handleMessage方法
3.Handler的基本方法
obtainMessage() --創造一個與Handler相聯絡的Message(先從訊息池中取出,若訊息池中沒有在生成一個Message)
post() ---創造一個帶有Runnable的Message,並sendMessageDelay(message,0)出去
postAtTime() --- 創造一個帶有Runnable的Message,並執行sendMessageAtTime()
postDelayed() ---創造一個帶有Runnable的Message,並執行sendMessageDelayed()
sendMessage() ---將訊息加到MessageQueue中
sendEmptyMessage() ---傳送一個空訊息到messageQueue中
sendMessageAtTime() ---在某個特定的時間,將訊息加入MessageQueue中
sendMessageDelayed() ---推遲時間,將訊息加入到MessageQueue中