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

Handler/Looper 核心类图

classDiagram class Looper { +static final ThreadLocal~Looper~ sThreadLocal +static prepare() +static prepareMainLooper() +static loop() +static myLooper() +static getMainLooper() +quit() +quitSafely() -MessageQueue mQueue -Thread mThread -boolean mInLoop +getQueue() MessageQueue +setMessageLogging(Printer printer) } class MessageQueue { +Message mMessages +boolean enqueueMessage(Message msg, long when) +Message next() +void quit(boolean safe) -long mPtr -boolean mQuitting -IdleHandler[] mIdleHandlers +addIdleHandler(IdleHandler handler) +removeIdleHandler(IdleHandler handler) } class 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() } class Handler { +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) -Looper mLooper -MessageQueue mQueue -Callback mCallback } class Handler_Callback { <> +handleMessage(Message msg) boolean } class MessageQueue_IdleHandler { <> +queueIdle() boolean } class ThreadLocal~T~ { +T get() +void set(T value) } Looper --> MessageQueue : 持有 Looper --> ThreadLocal : 使用 MessageQueue --> Message : 管理链表 Handler --> Looper : 关联 Handler --> MessageQueue : 通过Looper间接持有 Handler --> Handler_Callback : 可选回调 Handler --> Message : 创建和发送 Message --> Handler : target指向 MessageQueue --> MessageQueue_IdleHandler : 空闲处理

Handler/Looper 工作流程图

flowchart TD A[Handler发送消息] --> B[handler.sendMessage/post] B --> C[MessageQueue.enqueueMessage] C --> D[按时间排序插入消息队列] D --> E[Looper.loop循环] E --> F[MessageQueue.next] F --> G{有消息或未退出?} G -->|是| H[取出消息] G -->|否| I[线程结束] H --> J[msg.target.dispatchMessage] J --> K{msg.callback存在?} K -->|是| L[执行Runnable.run] K -->|否| M{mCallback存在?} M -->|是| N[执行mCallback.handleMessage] M -->|否| O[执行handler.handleMessage] L --> P[消息回收recycle] N --> P O --> P P --> E

详细时序图

sequenceDiagram participant App as 应用程序 participant Thread as 线程 participant Looper participant MessageQueue participant Handler participant Message App->>Thread: 创建线程 Thread->>Looper: Looper.prepare() Looper->>Looper: 创建Looper实例 Looper->>MessageQueue: 创建MessageQueue Looper->>ThreadLocal: sThreadLocal.set(looper) Thread->>Handler: 创建Handler Handler->>Looper: Looper.myLooper() Handler->>MessageQueue: 通过Looper获取mQueue Thread->>Looper: Looper.loop() loop 消息循环 Looper->>MessageQueue: next() MessageQueue-->>Looper: 返回Message Looper->>Handler: msg.target.dispatchMessage(msg) Handler->>Handler: handleMessage(msg) Handler->>Message: recycleUnchecked() end

关键类说明

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

相关推荐
生莫甲鲁浪戴4 小时前
Android Studio新手开发第二十一天
android·ide·android studio
生莫甲鲁浪戴4 小时前
Android Studio新手开发第二十二天
android·ide·android studio
用户41659673693554 小时前
Jetpack Compose 中实现带圆角边框的单词级富文本效果(分词与布局实践)
android
顾林海4 小时前
Android UI优化:让你的APP从“卡顿掉帧”到“丝滑如德芙”
android·面试·性能优化
啊森要自信5 小时前
【MySQL 数据库】MySQL用户管理
android·c语言·开发语言·数据库·mysql
黄毛火烧雪下5 小时前
(二)Flutter插件之Android插件开发
android·flutter
2501_916007475 小时前
iOS 上架技术支持全流程解析,从签名配置到使用 开心上架 的实战经验分享
android·macos·ios·小程序·uni-app·cocoa·iphone
sakoba7 小时前
MySQL的json处理相关方法
android·学习·mysql·json
神仙别闹7 小时前
Android 端 2D 横屏动作冒险类闯关游戏
android·游戏