消息處理機制之消息處理

要分析消息處理的流程,我們需要從Looper類的loop方法開始。

frameworks/base/core/java/android/os/Looper.java

public static void loop() {
        final Looper me = myLooper();
        final MessageQueue queue = me.mQueue;

        for (;;) {
            Message msg = queue.next(); // might block
            .....

            final long dispatchStart = needStartTime ? SystemClock.uptimeMillis() : 0;
            final long dispatchEnd;
            try {
                msg.target.dispatchMessage(msg);
                dispatchEnd = needEndTime ? SystemClock.uptimeMillis() : 0;
            } finally {

            }
            .....

            msg.recycleUnchecked();
        }
    }

在looper中調用queue.next方法,當沒有消息需要處理時,就會進入休眠狀態,直到有新消息需要處理纔會繼續執行,調用Message對象msg的成員變量target來處理。target是一個Handler對象,接下來就會調用dispatchMessage的實現。

public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }

dispatchMessage按以下順序來分發消息。

  1. 如果在發送消息時指定了一個回調接口,那麼msg.callback != null爲true就會調用Handler類的成員函數handleCallback來處理消息。
  2. 如果不滿足條件1,並且指定了一個Callback回調接口,那麼就會調用回調接口的handleMessage方法來處理消息。
  3. 如果不滿足2,且Callback回調接口handleMessage沒有處理消息,就會向下調用Handler類的成員函數handleMessage處理這個消息。
private static void handleCallback(Message message) {
    message.callback.run();
}

message的callback變量是一個Runnable對象,將消息交給Runnable的成員函數run來處理。

public final boolean post(Runnable r){
       return  sendMessageDelayed(getPostMessage(r), 0);
}
    
private static Message getPostMessage(Runnable r) {
    Message m = Message.obtain();
    m.callback = r;
    return m;
}

在發送消息時會調用類似post的方法,post方法會調用getPostMessage方法將Runnable封裝到一個Message對象中,最終消息有Runnable的run方法處理。

public interface Callback {
    public boolean handleMessage(Message msg);
}

public Handler(Callback callback) {
        this(callback, false);
    }

Callback接口只有一個成員函數handleMessage來處理消息。在創建Handler實例時需要一個傳遞一個實現了Callback接口的實例

public void handleMessage(Message msg) {
 }

handleMessage是Handler類的一個空實現。一般情況下我們都會繼承Handler類並在子類中重寫handleMessage方法,這樣就可以有子類來對消息進行處理。

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