首页/新闻资讯/正文详情

Android随笔-Handler的Message是什么结构

发布时间:2026/9/27 20:27:39 来源:云帆数科 栏目:资讯中心
Android随笔-Handler的Message是什么结构
Message 是对象它就是 Java 中的一个普通类继承自 Object。但 Android 对它做了大量优化让它在 Handler 机制中高效复用避免频繁创建和 GC。一、Message 的本质publicfinalclassMessageimplementsParcelable{publicintwhat;// 消息标识publicintarg1,arg2;// 轻量整型参数publicObjectobj;// 任意对象参数publicMessengerreplyTo;// 跨进程回复publiclongwhen;// 消息触发时间Bundledata;// 数据载体Handlertarget;// 目标 HandlerRunnablecallback;// 回调 Runnable// 链表指针用于消息池Messagenext;// 单链表指向池中的下一个 Message// 同步锁对象privatestaticfinalObjectsPoolSyncnewObject();// 消息池头节点privatestaticMessagesPool;// 消息池当前大小privatestaticintsPoolSize0;// 消息池最大容量privatestaticfinalintMAX_POOL_SIZE50;}核心点Message 是普通 Java 类不是基本类型不是 native 结构但它内部维护了一个静态消息池sPool用单链表实现对象复用二、消息池机制为什么高效1. 获取 Messageobtain()publicstaticMessageobtain(){synchronized(sPoolSync){if(sPool!null){MessagemsPool;// 从池头取一个sPoolm.next;// 池头后移m.nextnull;// 断开链表m.flags0;// 重置状态sPoolSize--;// 池大小减1returnm;// 返回复用的对象}}returnnewMessage();// 池空了才 new}2. 回收 Messagerecycle()publicvoidrecycle(){if(isInUse()){// 正在使用的消息不能回收return;}recycleUnchecked();}voidrecycleUnchecked(){// 重置所有字段flagsFLAG_IN_USE;what0;arg10;arg20;objnull;replyTonull;sendingUid-1;workSourceUid-1;when0;targetnull;callbacknull;datanull;synchronized(sPoolSync){if(sPoolSizeMAX_POOL_SIZE){nextsPool;// 头插法把自己插到池头sPoolthis;// 更新池头sPoolSize;// 池大小加1}}}3. 池结构示意初始状态sPool null, sPoolSize 0 obtain() 第1次池空 → new Message() → 返回新对象 obtain() 第2次池空 → new Message() → 返回新对象 // 两个消息被处理完后 recycle() recycle(msg2): msg2.next null; sPool msg2; sPoolSize 1 recycle(msg1): msg1.next msg2; sPool msg1; sPoolSize 2 // 再次 obtain() obtain(): 取 sPool(msg1); sPool msg2; sPoolSize 1 → 复用 msg1 obtain(): 取 sPool(msg2); sPool null; sPoolSize 0 → 复用 msg2三、为什么不用 new Message()方式结果new Message()堆上分配内存增加 GC 压力Message.obtain()优先从池复用几乎零分配实际效果一个高频 Handler如刷新 UI、动画每秒发 60 条消息用 obtain()前几次 new 之后全部从池复用零 GC用 new Message()每秒 60 个临时对象频繁 Young GC四、MessageQueue 中的 Message 是怎么存的publicfinalclassMessageQueue{MessagemMessages;// 消息队列头按 when触发时间排序的单链表// 入队booleanenqueueMessage(Messagemsg,longwhen){synchronized(this){msg.whenwhen;MessagepmMessages;if(pnull||when0||whenp.when){msg.nextp;// 插到队头mMessagesmsg;}else{// 按时间顺序找到插入位置Messageprev;for(;;){prevp;pp.next;if(pnull||whenp.when){break;}}msg.nextp;// 插入中间prev.nextmsg;}}returntrue;}}关键MessageQueue 本身也是用Message 的单链表实现不是数组不是队列类。Message.next 同时服务于两个链表消息池链表复用消息队列链表按时间排序五、与 Handler、Looper 的关系Looper.prepare() → 创建 Looper MessageQueue ↓ Looper.loop() → 无限循环 ├── MessageQueue.next() → 取消息阻塞/等待 │ └── 没到时间 → nativePollOnce() 休眠 │ └── 到时间了 → 返回 Message ├── msg.target.dispatchMessage(msg) → Handler 处理 │ └── msg.recycleUnchecked() → 回收到消息池 └── 继续循环六、常见误区误区真相“Message 是基本类型”❌ 是对象但用池复用“MessageQueue 用数组”❌ 用 Message 单链表“new Message() 和 obtain() 一样”❌ obtain() 优先复用性能差很多“消息池无限大”❌ 最大 50 个满了直接丢弃不回收“recycle() 后消息还能用”❌ 回收后字段全清空再用是未定义行为七、最佳实践// ✅ 正确用 obtain复用消息池MessagemsgMessage.obtain(handler,what,arg1,arg2,obj);handler.sendMessage(msg);// ✅ 正确用便捷方法内部也是 obtainhandler.obtainMessage(what).sendToTarget();handler.sendEmptyMessage(what);// ❌ 错误直接 new浪费内存MessagemsgnewMessage();// 不要这样八、总结Message 是 Java 对象不是基本类型也不是 native 结构。Android 用静态单链表维护了一个最大容量 50 的消息池通过 obtain() 复用、recycle() 回收避免高频 Handler 场景下的对象创建和 GC。MessageQueue 本身也是用 Message.next 指针串成的按时间排序的单链表——整个 Handler 机制的核心数据结构就是这一条 Message 链表在消息池和消息队列之间来回流转。

相关推荐

从交易到社群:车主服务生态的构建与用户价值延伸
从交易到社群:车主服务生态的构建与用户价值延伸

在汽车行业增量时代,经销商的核心目标是卖车,交易完成即意味着服务结束。而进入存量时代后,获客成本持续攀升,老用户的价值愈发凸显。只做一锤子买卖的经销商,会越来越难生存;能够构建车主服务生态&#xf… · 2026/9/16 23:02:15

WAIC2026产业信号:一人AI创业全指南
WAIC2026产业信号:一人AI创业全指南

WAIC2026产业信号:一人AI创业全指南写在最前面🌌你好!这里是 晓雨的笔记本 在所有感兴趣的领域扩展知识,感谢你的陪伴与支持~ 👋 欢迎添加文末好友,不定期掉落福利资讯 写在最前面 版权声明:本文… · 2026/9/11 10:18:52

ISP ToneMap:原理、必要性与应用场景
ISP ToneMap:原理、必要性与应用场景

摘要 ISP ToneMap(色调映射)是图像信号处理器(ISP)中的核心算法,负责将传感器捕获的高动态范围(HDR)数据智能压缩并映射到标准动态范围(SDR)显示设备上。它解决了现实世界广阔亮度范围与显示设备有限能力之间的根本矛盾,通过全局或局部映射算法,在保留高光和阴影细… · 2026/9/21 5:16:48

AI教材编写实用干货 高校教师必备的AI教材写作增效技巧
AI教材编写实用干货 高校教师必备的AI教材写作增效技巧

高校教材编写的AI辅助工具推荐 很多高校教材编写人员常遇到一个难题:虽然专业教材编写的正文内容用心完成,但因为缺少配套资源,整体效果大受影响。比如,课后练习本应设计出难易分明的题目,却往往缺乏新颖思路&#xf… · 2026/9/27 20:27:36

【人工智能:Agent】--Windows 安装 Codex 桌面版 + 用 CC Switch 配 TaoToken 接国内 LLM
【人工智能:Agent】--Windows 安装 Codex 桌面版 + 用 CC Switch 配 TaoToken 接国内 LLM

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

太原自学网站建设 3个实战案例拆解费用与避坑指南
太原自学网站建设 3个实战案例拆解费用与避坑指南

太原自学网站建设 3个实战案例拆解费用与避坑指南 模板网站太丑不够用?这大概是90%想自己搞官网的人第一反应。我在行业里摸爬滚打十年,见过太多人花大几千买了套模板,上线后发现配色刺眼、布局死板,根本体现不出公司实力。其实,… · 2026/9/27 20:27:30

DeepSeek Harness 开源首日 6.8 万星:V4 Pro 模型 AI Agent 部署实测与 TaoToken 统一 Key 配置
DeepSeek Harness 开源首日 6.8 万星:V4 Pro 模型 AI Agent 部署实测与 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/9/27 20:27:24

STM32串口DMA收发卡死:FE/NE错误恢复与HAL库实战指南
STM32串口DMA收发卡死:FE/NE错误恢复与HAL库实战指南

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

L1527不是编码器:4键15组合无线遥控芯片原理与实战
L1527不是编码器:4键15组合无线遥控芯片原理与实战

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

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码