Products
GG网络技术分享 2026-04-16 22:19 0
说起 Android 的消息机制, 我这脑子里立马冒出一堆快递、仓库、 挺好。 菜鸟驿站的画面——这不我把它比作快递处理中心于是开始胡思乱想。
先来点情绪:我对 Looper 那套东西又爱又恨, 爱的是它把 UI 线程撑起来恨的是每次调试都像在找失踪的包裹,有啥用呢?。

别问我为什么这么情绪化,我自己都不懂。
谨记... Looper 就像是菜鸟驿站的调度员,prepareMainLooper 那一步相当于在城市里开设了唯一的中心仓库。每个线程只能有一个 Looper, 这点跟我们生活中只能有一家快递公司一样——唯一、独占、不可替代。
源码里一句话概括: if != null) t 实不相瞒... hrow new RuntimeException;
我整个人都不好了。 MessageQueue 其实就是一条单链表,用来存放即将被处理的 Message。这里面最关键的两个方法:
next——负责从链表头部取出最早到期的 Message;enqueueMessage——把新来的包裹插入到合适的位置。说白了 就是一个排队买奶茶的场景,只不过这里排的是时间戳 when。
Handler 相当于快递员, 每个 Handler 必须指定 Looper,相当于每个快递员只能为指定的菜鸟中心送包裹。
创建 Handler 时可以带 Callback 参数, 这时就好比给快递员配了个副手,让副手先处理一部分事。源码里对应的是:,你看啊...
// Handler 构造函数
public Handler {
mLooper = looper;
mCallback = callback;
}
Message 相当于包裹, obtain 相当于包裹重复利用,快递处理完,这个包裹不能丢,还可以在下次包装快递用。
核心代码片段:
@Override
public void dispatchMessage {
if {
handleCallback;
} else {
if {
if ) return;
}
handleMessage;
}
}
- 如果 Message 中带有 callback 直接跑副手; - 否则看 Handler 是否实现了自己的 Callback若返回 true, 盘它... 则主手不干活; - 再说说才轮到 handleMessage 施行。
.sendMessage/.post/.sendEmptyMessageDelayed等方法,把 Message 放进队列。.recycleUnchecked 把对象放回 sPool,以便下次复用。103 行, 判断 mCallback,这个变量是在创建 Handler 中传入的,也就是快递员副手,如果存在副手,那就先让副手处理。副手如果还想让快递员处理,那返回 false,反之返回 true,记住...。
570~573 行, 拿到待存放的 msg 和 msg 的延时时间 when,以及目前消息队列 mMessages。
一句话概括... 730 行调用 enqueueMessage, 把 msg 存放到 MessageQueue 队列里面.
| # | 产品名称/工具名 | 适用场景 | 是否支持 Looper/Handler 调试? | 用户评分 |
|---|---|---|---|---|
| 1 | LoopeRex Debugger Pro | 高级 UI 调试 | ✅ 支持 | 4.8/5 ★★★★☆ |
| 2 | MessaGeXplorer Lite | 快速查看队列 | ✅ 部分支持 | 4.1/5 ★★★★✩ |
| 3 | PumpkinLooper | 教学演示 | ❌ 不支持 | 3.6/5 ★★★✩✩ |
| 4 | HandyHandlerKit | 跨线程通信辅助 | ✅ 完整支持 | 4.7/5 ★★★★★ |
| 5 | MsgPool Master | 内存优化 & 池管理 | ✅ 支持 | 4.3/5 ★★★★✩ |
| 6 | ChronoDelay Scheduler | 定时任务管理 | ✅ 支持 | 4.0/5 ★★★★✩ |
| *以上数据均为演示用途,并非真实测评后来啊。 | ||||
Demand feedback