继续:android.os.Looper#loopOnce
1 | try { |
重点:msg.target.dispatchMessage(msg);
这是 loopOnce 中最核心的一行代码。
- 分发者:
msg.target是发送该消息的Handler实例。 - 分发逻辑:它决定了消息最终由谁来处理。
- 调用链路:在
dispatchMessage内部,会按照优先级进行回调。
android.os.Handler#dispatchMessage
1 | /** |
消息处理的优先级
dispatchMessage 的源码清晰地展示了 Handler 处理消息的优先级顺序:
- 最高优先级:Message 的 callback
如果你通过handler.post(Runnable)发送消息,那么msg.callback就是这个Runnable。此时直接执行run()方法。 - 中等优先级:Handler 的 mCallback
如果你在构造 Handler 时传入了Handler.Callback接口实例:Handler(Looper.myLooper(), callback)
那么会先执行这个 callback。如果该 callback 返回true,则消息处理结束。 - 最低优先级:Handler 的 handleMessage 方法
这是最常用的方式,即子类重写handleMessage。只有当前两项都不满足(或第2项返回 false)时,才会执行到这里。
这种优先级设计为开发者提供了灵活的拦截和处理消息的方式。
总结:Handler 机制的完整闭环
- 发送:
Handler通过sendMessage系列方法,将Message(持有target引用)插入MessageQueue。 - 入队:
MessageQueue根据执行时间when对消息进行优先级排序。 - 循环:主线程的
Looper.loop()开启死循环,不断调用MessageQueue.next()取出消息。 - 阻塞:如果没有消息,
next()内部调用nativePollOnce让主线程进入高效休眠。 - 分发:一旦有消息,
Looper调用msg.target.dispatchMessage(msg)。 - 回调:
Handler根据优先级,最终回调到handleMessage或执行Runnable。