网站优化

网站优化

Products

当前位置:首页 > 网站优化 >

Android的消息机制是如何实现机制的?

GG网络技术分享 2026-04-16 22:19 0


先说点儿乱七八糟的前言

说起 Android 的消息机制, 我这脑子里立马冒出一堆快递、仓库、 挺好。 菜鸟驿站的画面——这不我把它比作快递处理中心于是开始胡思乱想。

先来点情绪:我对 Looper 那套东西又爱又恨, 爱的是它把 UI 线程撑起来恨的是每次调试都像在找失踪的包裹,有啥用呢?。

Android消息机制

别问我为什么这么情绪化,我自己都不懂。

什么是 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 施行。

消息流转全过程

  1. 指定 Looper: 创建 Handler 时传入 Looper,决定在哪条线程上跑。若不传,则默认使用主线程 Looper。
  2. 拿到当前 MessageQueue: Handler 持有 mQueue,即对应 Looper 的 MessageQueue。
  3. 发送消息: 调用 .sendMessage/.post/.sendEmptyMessageDelayed等方法,把 Message 放进队列。
  4. Looper.loop 循环: 不停调用 MessageQueue.next 把最近到期的 Message 拿出来然后交给对应的 Handler.dispatchMessage 处理。
  5. 回收 Message: 处理完后施行 .recycleUnchecked 把对象放回 sPool,以便下次复用。

代码碎片拼接

103 行, 判断 mCallback,这个变量是在创建 Handler 中传入的,也就是快递员副手,如果存在副手,那就先让副手处理。副手如果还想让快递员处理,那返回 false,反之返回 true,记住...。

570~573 行, 拿到待存放的 msg 和 msg 的延时时间 when,以及目前消息队列 mMessages。

一句话概括... 730 行调用 enqueueMessage, 把 msg 存放到 MessageQueue 队列里面.

随机产品对比表格

ZippyTrace Analyzer

"闹钟式”延时消息到底是怎么回事?🤔​‍️​‍♀️​‍♂️​‍⚕️​‍🚀​‍💻​‍🧑‍💻​‍🧑‍🔬​‍🏭​​‍🔧​​‍🔬​​🛠️​​📦​​📦​​💡​​🚚​​​🙈​​​😂​​​👀​​​🌟​​​✨​​​​🎉​​​​📱​​​⌚​​​⏱️​​​🔍​​​​⏰​​​​⏲️ ​​​​​​‏‏‏‏‏‏‏‏‏‏‏‎ ‎‎‎ ‎ ‎‎ ‎‎  

#产品名称/工具名适用场景是否支持 Looper/Handler 调试?用户评分
1LoopeRex Debugger Pro高级 UI 调试 ✅ 支持 4.8/5 ★★★★☆
2MessaGeXplorer Lite 快速查看队列 ✅ 部分支持 4.1/5 ★★★★✩
3PumpkinLooper 教学演示 ❌ 不支持 3.6/5 ★★★✩✩
4HandyHandlerKit跨线程通信辅助✅ 完整支持4.7/5 ★★★★★
5 MsgPool Master内存优化 & 池管理✅ 支持 4.3/5 ★★★★✩
6 ChronoDelay Scheduler 定时任务管理 ✅ 支持 4.0/5 ★★★★✩
*以上数据均为演示用途,并非真实测评后来啊。


提交需求或反馈

Demand feedback