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等多种数据存储方式
设计要点
- 线程隔离: 每个线程有独立的Looper和MessageQueue
- 对象复用: Message对象池减少GC压力
- 时间排序: 消息按执行时间排序,支持延时消息
- 安全退出: quitSafely()确保所有消息处理完再退出
- 空闲优化: IdleHandler机制充分利用CPU空闲时间
这套机制是Android异步编程的核心基础,理解它对性能优化和问题排查都有重要意义。