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

相关推荐
new_dev9 小时前
Python实现Android自动化打包工具:加固、签名、多渠道一键完成
android·python·自动化
小孔龙9 小时前
Android `<activity-alias>` 指南:动态图标 · 多入口 · 重命名兼容
android·程序员·掘金·日新计划
QING6189 小时前
Kotlin inline 实战详解 —— 新手须知
android·kotlin·android jetpack
ElevenS_it1889 小时前
MySQL慢查询监控与告警实战:从slow_log采集到分钟级定位慢SQL的完整链路配置
android·sql·mysql
沐言人生10 小时前
ReactNative 源码分析12——Native View创建流程onBatchComplete
android·react native
caicai_xiaobai10 小时前
QT搭建安卓开发环境
android
YF021110 小时前
Android 异形屏与横屏全屏沉浸式适配技术方案
android·app
2501_9419820510 小时前
通过 API 实时监听企业微信外部群变更事件并同步本地数据库
android·自动化·企业微信·rpa
白雪落青衣11 小时前
buuoj course 1详细解析
android
恋猫de小郭11 小时前
Android 发布全新性能分析器,实用性和性能大升级
android·前端·flutter