1. 程式人生 > >Loop,Handler,Message的原始碼解析

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中