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

相关推荐
阿巴斯甜6 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker6 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95277 小时前
Andorid Google 登录接入文档
android
黄林晴9 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab21 小时前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android