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); } } };
|