Android Framework 专项 - Handler(三)

继续:android.os.Looper#loopOnce
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
try {
msg.target.dispatchMessage(msg);
if (observer != null) {
observer.messageDispatched(token, msg);
}
dispatchEnd = needEndTime ? SystemClock.uptimeMillis() : 0;
} catch (Exception exception) {
if (observer != null) {
observer.dispatchingThrewException(token, msg, exception);
}
throw exception;
} finally {
ThreadLocalWorkSource.restore(origWorkSource);
if (traceTag != 0) {
Trace.traceEnd(traceTag);
}
}
重点:msg.target.dispatchMessage(msg);

这是 loopOnce 中最核心的一行代码。

  1. 分发者msg.target 是发送该消息的 Handler 实例。
  2. 分发逻辑:它决定了消息最终由谁来处理。
  3. 调用链路:在 dispatchMessage 内部,会按照优先级进行回调。

android.os.Handler#dispatchMessage
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* Handle system messages here.
*/
public void dispatchMessage(@NonNull Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
消息处理的优先级

dispatchMessage 的源码清晰地展示了 Handler 处理消息的优先级顺序:

  1. 最高优先级:Message 的 callback
    如果你通过 handler.post(Runnable) 发送消息,那么 msg.callback 就是这个 Runnable。此时直接执行 run() 方法。
  2. 中等优先级:Handler 的 mCallback
    如果你在构造 Handler 时传入了 Handler.Callback 接口实例:
    Handler(Looper.myLooper(), callback)
    那么会先执行这个 callback。如果该 callback 返回 true,则消息处理结束。
  3. 最低优先级:Handler 的 handleMessage 方法
    这是最常用的方式,即子类重写 handleMessage。只有当前两项都不满足(或第2项返回 false)时,才会执行到这里。

这种优先级设计为开发者提供了灵活的拦截和处理消息的方式。


总结:Handler 机制的完整闭环

  1. 发送Handler 通过 sendMessage 系列方法,将 Message(持有 target 引用)插入 MessageQueue
  2. 入队MessageQueue 根据执行时间 when 对消息进行优先级排序。
  3. 循环:主线程的 Looper.loop() 开启死循环,不断调用 MessageQueue.next() 取出消息。
  4. 阻塞:如果没有消息,next() 内部调用 nativePollOnce 让主线程进入高效休眠。
  5. 分发:一旦有消息,Looper 调用 msg.target.dispatchMessage(msg)
  6. 回调Handler 根据优先级,最终回调到 handleMessage 或执行 Runnable
, ,