Android的消息机制是如何实现机制的?
- 内容介绍
- 文章标签
- 相关推荐
先说点儿乱七八糟的前言
说起 Android 的消息机制, 我这脑子里立马冒出一堆快递、仓库、 挺好。 菜鸟驿站的画面——这不我把它比作快递处理中心于是开始胡思乱想。
先来点情绪:我对 Looper 那套东西又爱又恨, 爱的是它把 UI 线程撑起来恨的是每次调试都像在找失踪的包裹,有啥用呢?。

别问我为什么这么情绪化,我自己都不懂。
什么是 Looper?
谨记... Looper 就像是菜鸟驿站的调度员,prepareMainLooper 那一步相当于在城市里开设了唯一的中心仓库。每个线程只能有一个 Looper, 这点跟我们生活中只能有一家快递公司一样——唯一、独占、不可替代。
源码里一句话概括: if != null) t 实不相瞒... hrow new RuntimeException;
MessageQueue——单链表的“货架”
我整个人都不好了。 MessageQueue 其实就是一条单链表,用来存放即将被处理的 Message。这里面最关键的两个方法:
next——负责从链表头部取出最早到期的 Message;enqueueMessage——把新来的包裹插入到合适的位置。
说白了 就是一个排队买奶茶的场景,只不过这里排的是时间戳 when。
Handler:快递员还是副手?
Handler 相当于快递员, 每个 Handler 必须指定 Looper,相当于每个快递员只能为指定的菜鸟中心送包裹。
创建 Handler 时可以带 Callback 参数, 这时就好比给快递员配了个副手,让副手先处理一部分事。源码里对应的是:,你看啊...
// Handler 构造函数
public Handler {
mLooper = looper;
mCallback = callback;
}
dispatchMessage 的内部戏码
Message 相当于包裹, obtain 相当于包裹重复利用,快递处理完,这个包裹不能丢,还可以在下次包装快递用。
核心代码片段:
@Override
public void dispatchMessage {
if {
handleCallback;
} else {
if {
if ) return;
}
handleMessage;
}
}
- 如果 Message 中带有 callback 直接跑副手; - 否则看 Handler 是否实现了自己的 Callback若返回 true, 盘它... 则主手不干活; - 再说说才轮到 handleMessage 施行。
消息流转全过程
- 指定 Looper: 创建 Handler 时传入 Looper,决定在哪条线程上跑。若不传,则默认使用主线程 Looper。
- 拿到当前 MessageQueue: Handler 持有 mQueue,即对应 Looper 的 MessageQueue。
- 发送消息:
调用
.sendMessage/.post/.sendEmptyMessageDelayed等方法,把 Message 放进队列。 - Looper.loop 循环: 不停调用 MessageQueue.next 把最近到期的 Message 拿出来然后交给对应的 Handler.dispatchMessage 处理。
- 回收 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 ★★★★✩ |
| *以上数据均为演示用途,并非真实测评后来啊。 | ||||
先说点儿乱七八糟的前言
说起 Android 的消息机制, 我这脑子里立马冒出一堆快递、仓库、 挺好。 菜鸟驿站的画面——这不我把它比作快递处理中心于是开始胡思乱想。
先来点情绪:我对 Looper 那套东西又爱又恨, 爱的是它把 UI 线程撑起来恨的是每次调试都像在找失踪的包裹,有啥用呢?。

别问我为什么这么情绪化,我自己都不懂。
什么是 Looper?
谨记... Looper 就像是菜鸟驿站的调度员,prepareMainLooper 那一步相当于在城市里开设了唯一的中心仓库。每个线程只能有一个 Looper, 这点跟我们生活中只能有一家快递公司一样——唯一、独占、不可替代。
源码里一句话概括: if != null) t 实不相瞒... hrow new RuntimeException;
MessageQueue——单链表的“货架”
我整个人都不好了。 MessageQueue 其实就是一条单链表,用来存放即将被处理的 Message。这里面最关键的两个方法:
next——负责从链表头部取出最早到期的 Message;enqueueMessage——把新来的包裹插入到合适的位置。
说白了 就是一个排队买奶茶的场景,只不过这里排的是时间戳 when。
Handler:快递员还是副手?
Handler 相当于快递员, 每个 Handler 必须指定 Looper,相当于每个快递员只能为指定的菜鸟中心送包裹。
创建 Handler 时可以带 Callback 参数, 这时就好比给快递员配了个副手,让副手先处理一部分事。源码里对应的是:,你看啊...
// Handler 构造函数
public Handler {
mLooper = looper;
mCallback = callback;
}
dispatchMessage 的内部戏码
Message 相当于包裹, obtain 相当于包裹重复利用,快递处理完,这个包裹不能丢,还可以在下次包装快递用。
核心代码片段:
@Override
public void dispatchMessage {
if {
handleCallback;
} else {
if {
if ) return;
}
handleMessage;
}
}
- 如果 Message 中带有 callback 直接跑副手; - 否则看 Handler 是否实现了自己的 Callback若返回 true, 盘它... 则主手不干活; - 再说说才轮到 handleMessage 施行。
消息流转全过程
- 指定 Looper: 创建 Handler 时传入 Looper,决定在哪条线程上跑。若不传,则默认使用主线程 Looper。
- 拿到当前 MessageQueue: Handler 持有 mQueue,即对应 Looper 的 MessageQueue。
- 发送消息:
调用
.sendMessage/.post/.sendEmptyMessageDelayed等方法,把 Message 放进队列。 - Looper.loop 循环: 不停调用 MessageQueue.next 把最近到期的 Message 拿出来然后交给对应的 Handler.dispatchMessage 处理。
- 回收 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 ★★★★✩ |
| *以上数据均为演示用途,并非真实测评后来啊。 | ||||

