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

相关推荐
_祝你今天愉快10 小时前
从驱动来分析服务的添加过程
android
Dovis(誓平步青云)13 小时前
折叠屏悬停看视频,上半屏和下半屏应该各做什么
android·java·服务器·开发语言·安全·音视频
alexhilton14 小时前
让架构边界变成可执行的测试
android·kotlin·android jetpack
hai_android15 小时前
SendChannel 与 ReceiveChannel 通信机制
android
数据治理自习室17 小时前
AI 应用评测体系(GraphRAG)
android·大数据·人工智能·kotlin
爱笑鱼18 小时前
Android 系统启动机制(五):system_server 是 init 启动的,还是 Zygote fork 出来的?
android
智购科技无人售货机工厂18 小时前
2026自动售货机防拆机物理安全设计:从安全螺丝到结构互锁的工程实践~YH
android·网络·驱动开发·python·单片机·安全·云原生
开开心心就好19 小时前
电子教鞭工具支持画框写字插图片功能齐全
android·开发语言·前端·javascript·人工智能·pdf·html
Dovis(誓平步青云)19 小时前
拍视频前先把镜头想清楚:做一个分镜取景辅助器
android·java·服务器·javascript·人工智能
峥嵘life20 小时前
Android16 系统 APEX 模块说明
android·大数据·开发语言