【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 { <<interface>> +handleMessage(Message msg) boolean } class MessageQueue_IdleHandler { <<interface>> +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异步编程的核心基础,理解它对性能优化和问题排查都有重要意义。

相关推荐
执明wa2 小时前
LayoutInflater详解: XML是如何变成View的?
android·xml·开发语言·android studio
404_coder2 小时前
源码视角下的 Android 开机流程:从 Zygote、SystemServer 到 Launcher
android
二流小码农3 小时前
鸿蒙开发:以登录案例了解代码架构MVVM
android·ios·harmonyos
用户69371750013843 小时前
从代码生产者到 AI 协作者:软件工程师的角色重构
android·前端·后端
GitLqr4 小时前
别在 Flutter 的 main() 里乱锁屏幕方向,小心 iPad 分屏功能被你搞没了
android·flutter·ios
sg_knight4 小时前
MySQL 存储过程详解:从入门到实战
android·数据库·mysql·database·dba·关系型数据库·db
爱笑鱼4 小时前
Binder(四):ioctl(BINDER_WRITE_READ) 之后,事务怎样到达目标进程?
android
AFinalStone4 小时前
Android 7系统休眠唤醒(二)开机全链路—BootROM到Launcher
android·电源管理·休眠唤醒
Mr YiRan4 小时前
Android NDK开发之统计到未被回收的图片
android