要分析消息处理的流程,我们需要从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方法,这样就可以有子类来对消息进行处理。