要分析消息處理的流程,我們需要從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按以下順序來分發消息。
- 如果在發送消息時指定了一個回調接口,那麼msg.callback != null爲true就會調用Handler類的成員函數handleCallback來處理消息。
- 如果不滿足條件1,並且指定了一個Callback回調接口,那麼就會調用回調接口的handleMessage方法來處理消息。
- 如果不滿足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方法,這樣就可以有子類來對消息進行處理。