0%

安卓Handle机制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
安卓 Handler 机制是 Android 中用于解决线程间通信和异步消息处理的核心机制,尤其在处理 UI 更新时至关重要。

核心概念与作用 💡
作用: 允许在非 UI 线程(如子线程)中向主线程(UI 线程)发送消息或执行任务,从而实现线程间通信和更新 UI(因为 Android 要求 UI 操作必须在主线程进行)。

核心原则: 异步通信和消息队列。


主要组成部分 🧱
Handler 机制主要由以下四个核心组件构成:

1. Handler(处理者)
作用: 负责向 MessageQueue 中发送 Message 或 Runnable,以及在关联的 Looper 接收到消息后,执行相应的处理逻辑(即 handleMessage() 方法)。

创建: Handler 实例会关联到创建它的线程的 Looper。通常在主线程创建,使其能处理主线程的消息。

2. Message(消息)
作用: 线程间传递的信息载体。可以携带数据(如通过 what、arg1、arg2、obj 字段)。

发送: 通过 Handler.sendMessage() 或 Handler.post() 方法发送。

3. MessageQueue(消息队列)
作用: 存储 Handler 发送的所有待处理的消息(Message 或 Runnable)。它是一个先进先出 (FIFO) 的队列。

特点: 每个线程最多只有一个 Looper,每个 Looper 会对应一个 MessageQueue。

4. Looper(循环器)
作用: 负责从 MessageQueue 中不断地取出消息,并将取出的消息分发给对应的 Handler 进行处理。

工作方式: 使用一个无限循环 (loop()) 来实现。

主线程 Looper: Android 应用启动时,系统会自动为主线程创建一个 Looper。

工作流程 🔄
一个完整的 Handler 流程如下:

发送消息: 在一个子线程(或其他线程)中,通过 Handler 的 sendMessage() 或 post() 方法将一个 Message 或 Runnable 放入 MessageQueue。

消息循环: 与 Handler 关联的线程(通常是主线程)的 Looper 开始工作,在无限循环中不断地从 MessageQueue 中取出消息。

消息分发: Looper 将取出的消息分发回给发送该消息的 Handler。

消息处理: Handler 接收到消息后,在其 handleMessage() 方法中执行具体的逻辑,完成任务(例如更新 UI)。


简单示例 📝
发送消息:

Java

// 在子线程中
new Thread(() -> {
// ... 执行耗时操作
Message msg = handler.obtainMessage(WHAT_CODE, data);
handler.sendMessage(msg); // 将消息发送到主线程的消息队列
}).start();
处理消息(在主线程 Handler 中):

Java

// 在主线程中定义 Handler
private final Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
if (msg.what == WHAT_CODE) {
// ... 在主线程中更新 UI
textView.setText("数据加载完成: " + msg.obj);
}
}
};