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/7/26 16:27:52 阅读更多 →
高效阅读训练:提升技术文档处理能力的科学方法

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

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

2026/7/26 16:28:31 阅读更多 →
第八篇:Redis 为什么不会每次修改都写磁盘?

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

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

2026/7/24 7:50:32 阅读更多 →

最新新闻

嵌入式EMIF接口配置:从异步时序到NAND Flash的实战指南

嵌入式EMIF接口配置:从异步时序到NAND Flash的实战指南

1. 项目概述与核心价值在嵌入式系统开发中,处理器与外部存储器的通信是构建稳定、高效应用的基础。外部存储器接口(EMIF)作为连接两者的桥梁,其配置的精准与否直接决定了系统能否稳定运行、数据能否可靠存取。很多开发者初次接触E…

2026/7/26 16:28:32 阅读更多 →
go2rtc:5分钟搭建零延迟视频监控系统,告别协议不兼容烦恼

go2rtc:5分钟搭建零延迟视频监控系统,告别协议不兼容烦恼

go2rtc:5分钟搭建零延迟视频监控系统,告别协议不兼容烦恼 【免费下载链接】go2rtc Ultimate camera streaming application 项目地址: https://gitcode.com/GitHub_Trending/go/go2rtc 你是否曾被监控摄像头的各种协议搞得晕头转向?RT…

2026/7/26 16:28:32 阅读更多 →
深入解析OMAP5912电源管理:从动态电压调节到多核低功耗实战

深入解析OMAP5912电源管理:从动态电压调节到多核低功耗实战

1. 项目概述与核心价值在嵌入式系统,尤其是电池供电的移动和物联网设备开发中,电源管理从来都不是一个“锦上添花”的选项,而是决定产品成败的核心技术。我经历过不止一个项目,硬件设计精良,软件功能完善,最…

2026/7/26 16:28:32 阅读更多 →
如何安装与配置Stream Detector?3分钟快速上手教程

如何安装与配置Stream Detector?3分钟快速上手教程

如何安装与配置Stream Detector?3分钟快速上手教程 【免费下载链接】stream-detector A Firefox addon for keeping track of manifests used by various streaming protocols and downloading media files. 项目地址: https://gitcode.com/gh_mirrors/st/stream-…

2026/7/26 16:28:32 阅读更多 →
真正拉开 Agent 差距的 Harness 工程:编排、护栏与模型选型

真正拉开 Agent 差距的 Harness 工程:编排、护栏与模型选型

真正拉开 Agent 差距的 Harness 工程:编排、护栏与模型选型 摘要 同一个模型接入同一组工具,为什么一个 Agent 能稳定交付,另一个却循环调用、越权操作或过早宣布完成?差异往往来自 Harness:围绕模型构建的上下文、工…

2026/7/26 16:28:32 阅读更多 →
告别风扇噪音烦恼!Fan Control让你的电脑风扇智能又安静

告别风扇噪音烦恼!Fan Control让你的电脑风扇智能又安静

告别风扇噪音烦恼!Fan Control让你的电脑风扇智能又安静 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/…

2026/7/26 16:27:32 阅读更多 →

日新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

月新闻