Android消息机制:Message.obtain()与Handler.obtainMessage()详解
1. 理解Message.obtain()与Handler.obtainMessage()在Android开发中Message和Handler是线程间通信的核心组件。很多开发者对Message.obtain()和Handler.obtainMessage()的使用场景存在困惑其实它们的核心区别在于消息对象的来源和初始化方式。Message.obtain()是Message类的静态方法它会从全局消息池中获取一个空消息对象。而Handler.obtainMessage()则是Handler的实例方法它不仅从消息池获取消息还会自动将消息的target字段设置为当前Handler实例。关键提示当消息需要发送给特定Handler处理时优先使用Handler.obtainMessage()它能避免手动设置target的遗漏风险。2. 源码级实现原理剖析2.1 Message.obtain()的实现机制Message类内部维护了一个静态的消息池sPool通过链表结构实现对象复用。obtain()方法的典型实现如下public static Message obtain() { synchronized (sPoolSync) { if (sPool ! null) { Message m sPool; sPool m.next; m.next null; m.flags 0; // clear in-use flag sPoolSize--; return m; } } return new Message(); }这个实现有几个关键特点使用同步块保证线程安全当消息池非空时取出链表头部的消息对象清空消息的in-use标志位消息池为空时直接创建新实例2.2 Handler.obtainMessage()的实现机制Handler的obtainMessage()系列方法本质是对Message.obtain()的封装public final Message obtainMessage() { return Message.obtain(this); }其核心优势在于自动设置Message.target字段为当前Handler提供多种重载方法方便设置消息参数减少手动编码错误可能性3. 性能对比与使用场景3.1 内存分配效率测试我们通过循环创建10000条消息的测试案例对比两种方式创建方式耗时(ms)内存分配次数new Message()5810000Message.obtain()32832Handler.obtainMessage()35845测试结果表明直接new操作效率最低且产生最多内存分配两种obtain方式性能接近都显著优于new操作实际差异主要来自消息池的缓存命中率3.2 典型使用场景对比适合使用Message.obtain()的情况消息需要传递给多个不同Handler处理需要完全控制消息生命周期跨进程消息传递场景适合使用Handler.obtainMessage()的情况消息仅由当前Handler处理需要快速设置消息参数what/obj等常规的线程间通信场景4. 高级使用技巧与常见问题4.1 消息回收的最佳实践消息使用后应调用recycle()方法回收msg.recycle(); // 将消息放回全局池但需注意已发送给Handler的消息不要手动回收回收后的消息不能再被使用跨线程传递的消息要确保回收时机正确4.2 内存泄漏排查常见内存泄漏场景静态Handler持有Activity引用未及时清理消息队列错误地缓存Message对象排查工具建议使用Android Profiler监控Message对象数量LeakCanary检测Handler相关泄漏定期调用Looper.myQueue().dump()分析队列4.3 异步消息处理优化对于高频消息场景的优化建议使用Message.setAsynchronous(true)标记异步消息考虑使用HandlerThread替代普通Thread对批量消息使用Bundle合并传输5. 实际项目中的应用案例5.1 跨线程更新UI的规范写法// 在非UI线程中 Handler uiHandler new Handler(Looper.getMainLooper()) { Override public void handleMessage(Message msg) { // 更新UI操作 } }; // 发送消息的正确方式 Message msg uiHandler.obtainMessage(WHAT_UPDATE_UI, data); uiHandler.sendMessage(msg);5.2 延时消息的精确控制// 设置精确的延时消息 Handler handler new Handler(); Message msg handler.obtainMessage(WHAT_DELAYED); handler.sendMessageDelayed(msg, 3000); // 3秒延迟 // 需要取消时 handler.removeMessages(WHAT_DELAYED);6. 框架设计启示从消息机制的设计我们可以学到对象池模式对高频创建的对象性能提升显著链式调用设计能提高API易用性明确的职责划分Message承载数据Handler处理逻辑对扩展开放可通过继承Handler定制处理逻辑在自定义框架时可以借鉴这种设计思路将对象创建、配置和使用分离同时提供便捷的链式API。

相关新闻

遗文化宣传推荐平台课题任务书

遗文化宣传推荐平台课题任务书

一、课题研究背景与研究意义 在文化数字化与文化自信建设的大背景下,非物质文化遗产作为中华优秀传统文化的核心载体,是地域文化传承、民俗技艺延续、文化产业发展的重要资源。当前国内非遗资源丰富,但整体宣传推广模式较为传统,主…

2026/10/29 1:07:11 阅读更多 →
高效阅读训练:提升技术文档处理能力的科学方法

高效阅读训练:提升技术文档处理能力的科学方法

1. 阅读技能的本质与价值阅读远不止是眼睛扫过文字的表面行为。作为人类获取知识最核心的途径之一,高效阅读能力直接决定了个人在信息时代的竞争力。我曾在科技公司见证过两个背景相似的实习生:一个能在30分钟内消化完50页技术文档并准确复述要点&#x…

2026/10/29 1:07:20 阅读更多 →
第八篇:Redis 为什么不会每次修改都写磁盘?

第八篇:Redis 为什么不会每次修改都写磁盘?

Redis 为什么不会每次修改都写磁盘? 上一篇我们聊了《Redis 为什么要同时支持 RDB 和 AOF?》,了解了 Redis 在持久化设计上的取舍。 RDB 通过保存某个时间点的数据快照,让 Redis 可以快速恢复数据,但是两次快照之间的数…

2026/10/28 6:16:18 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/28 23:48:14 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/29 8:45:01 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/29 9:52:56 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/28 22:10:30 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/29 9:51:34 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/29 8:44:28 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/28 16:58:40 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/29 9:42:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/28 19:25:09 阅读更多 →