【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异步编程的核心基础,理解它对性能优化和问题排查都有重要意义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐怡旸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值