【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

详细时序图

应用程序 线程 Looper MessageQueue Handler Message ThreadLocal 创建线程 Looper.prepare() 创建Looper实例 创建MessageQueue sThreadLocal.set(looper) 创建Handler Looper.myLooper() 通过Looper获取mQueue Looper.loop() next() 返回Message msg.target.dispatchMessage(msg) handleMessage(msg) recycleUnchecked() loop [消息循环] 应用程序 线程 Looper MessageQueue Handler Message ThreadLocal

关键类说明

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

相关推荐
JAVA面经实录91716 小时前
Java企业级工程化·终极完整版背诵手册(无遗漏、全覆盖、面试+落地通用)
java·开发语言·面试
许彰午18 小时前
CacheSQL(二):主从复制——OpLog 环形缓冲区与故障自动恢复
java·数据库·缓存
20YC编程社区18 小时前
一分钟学会绘制Mermaid流程图
流程图·markdown·mermaid流程图
liang_jy18 小时前
Android SparseArray
android·源码
liang_jy19 小时前
Activity 启动流程扩展篇(一)—— startActivityInner 任务决策全解析
android·源码
Bat U19 小时前
JavaEE|多线程初阶(七)
java·开发语言
NPE~20 小时前
[App逆向]脱壳实战
android·教程·逆向·android逆向·逆向分析
木易 士心20 小时前
别再只会用 drawCircle 了!一文搞懂 Android Canvas 底层机制
android
掌心向暖RPA自动化21 小时前
如何获取网页某个元素在屏幕可见部分的中心坐标影刀RPA懒加载坐标定位技巧
java·javascript·自动化·rpa·影刀rpa
AtOR CUES21 小时前
MySQL——表操作及查询
android·mysql·adb