当前位置: 首页 > news >正文

【Android】Handler/Looper机制相关的类图和流程图

Handler/Looper 核心类图

持有
使用
管理链表
关联
通过Looper间接持有
可选回调
创建和发送
target指向
空闲处理
Looper
+static final ThreadLocal<Looper> sThreadLocal
-MessageQueue mQueue
-Thread mThread
-boolean mInLoop
+static prepare()
+static prepareMainLooper()
+static loop()
+static myLooper()
+static getMainLooper()
+quit()
+quitSafely()
+getQueue() : MessageQueue
+setMessageLogging(Printer printer)
MessageQueue
+Message mMessages
-long mPtr
-boolean mQuitting
-IdleHandler[] mIdleHandlers
+boolean enqueueMessage(Message msg, long when)
+Message next()
+void quit(boolean safe)
+addIdleHandler(IdleHandler handler)
+removeIdleHandler(IdleHandler handler)
Message
+int what
+int arg1
+int arg2
+Object obj
+Handler target
+Runnable callback
+long when
+Message next
+Bundle data
+static Message obtain()
+void sendToTarget()
+void recycle()
Handler
-Looper mLooper
-MessageQueue mQueue
-Callback mCallback
+Handler()
+Handler(Looper looper)
+Handler(Callback callback)
+handleMessage(Message msg)
+sendMessage(Message msg) : boolean
+sendMessageDelayed(Message msg, long delayMillis) : boolean
+post(Runnable r) : boolean
+obtainMessage() : Message
+dispatchMessage(Message msg)
«interface»
Handler_Callback
+handleMessage(Message msg) : boolean
«interface»
MessageQueue_IdleHandler
+queueIdle() : boolean
ThreadLocal<T>
+T get()
+void set(T value)

Handler/Looper 工作流程图

Handler发送消息
handler.sendMessage/post
MessageQueue.enqueueMessage
按时间排序插入消息队列
Looper.loop循环
MessageQueue.next
有消息或未退出?
取出消息
线程结束
msg.target.dispatchMessage
msg.callback存在?
执行Runnable.run
mCallback存在?
执行mCallback.handleMessage
执行handler.handleMessage
消息回收recycle

详细时序图

应用程序线程LooperMessageQueueHandlerMessageThreadLocal创建线程Looper.prepare()创建Looper实例创建MessageQueuesThreadLocal.set(looper)创建HandlerLooper.myLooper()通过Looper获取mQueueLooper.loop()next()返回Messagemsg.target.dispatchMessage(msg)handleMessage(msg)recycleUnchecked()loop[消息循环]应用程序线程LooperMessageQueueHandlerMessageThreadLocal

关键类说明

1. Looper 核心职责

  • 线程单例: 通过ThreadLocal保证每个线程只有一个Looper
  • 消息循环: loop()方法无限循环从MessageQueue取消息
  • 主线程准备: prepareMainLooper()为主线程准备Looper

2. MessageQueue 核心功能

  • 消息队列: 按时间顺序维护Message链表
  • Native支持: 使用mPtr指向Native层的MessageQueue
  • 空闲处理: 支持IdleHandler在队列空闲时执行

3. Handler 消息处理

  • 消息发送: sendMessage(), post()等方法
  • 消息分发: dispatchMessage()决定消息处理路径
  • 线程切换: 实现跨线程通信

4. Message 消息对象

  • 对象池: 使用obtain()从对象池获取,避免频繁创建
  • 目标指向: target字段指向处理该消息的Handler
  • 数据载体: what, arg1, arg2, obj, data等多种数据存储方式

设计要点

  1. 线程隔离: 每个线程有独立的Looper和MessageQueue
  2. 对象复用: Message对象池减少GC压力
  3. 时间排序: 消息按执行时间排序,支持延时消息
  4. 安全退出: quitSafely()确保所有消息处理完再退出
  5. 空闲优化: IdleHandler机制充分利用CPU空闲时间

这套机制是Android异步编程的核心基础,理解它对性能优化和问题排查都有重要意义。

http://www.dtcms.com/a/515688.html

相关文章:

  • ARM《1》_回顾gcc、动态编译和静态编译、MakeFile的使用
  • 网络环路:隐形威胁的破解之道
  • stm32 can错误中断不处理
  • 我们平常说的连网是指什么?
  • 网站优化人员新乡市延津县建设局网站
  • 网站建设分析从哪几个方面东莞市招聘网
  • 设计模式-责任链模式:从鞋厂审批流程看请求处理的艺术
  • 21_AI智能体开发架构搭建之基于Flask蓝图模块化构建可扩展的知识库服务实践
  • 【手机篇】AI深度学习在手机摄像头模组支架外观检测应用方案
  • 手机版矩阵系统源码搭建与定制开发:深度技术解析与落地实践
  • 做网站首页可以用传媒公司吗软件 项目管理系统
  • 舟山建设工程信息网站北京设计公司招聘
  • Elasticsearch还有哪些常用的分词器?
  • 使用CNN构建VAE
  • TESOLLO:使用MANUS Franka机械臂提高机器人灵活性
  • 西宁建设网站软件陕西交通建设有限公司网站
  • COMAU柯马焊接机器人气保焊省气
  • 西门子 1500 PLC 依托 Ethernet/ip 转 Modbus RTU联合发那科机器人优化生产流程
  • 全球首个超声多模态大模型!百度百舸支撑海豚智能实现高效训练与稳定服务
  • 统一机器人描述格式---URDF
  • SCARA 机器人点到点(PTP)轨迹规划方法
  • 岳阳市网站建设推广搜索引擎优化是什么?
  • 阿里云代理商:阿里云负载均衡是什么?
  • 安川机器人motoplus二次开发实现socket 变量读写 SKILLSND命令接收 轨迹实时修正功能
  • 社交网站 备案wordpress硬件接口
  • Redis未授权访问漏洞:从原理到高级利用
  • 项目实践3—全球证件智能识别系统(Qt客户端开发+FastAPI后端人工智能服务开发)
  • 【LeetCode】87. 扰乱字符串
  • React学习路径与实践指南
  • Linux系统的ARM库移植