Android Handler、Looper、Message
在Android开发中,Handler
、Looper
、Message
是处理线程通信的核心类,特别是在需要更新UI或者从后台线程传递数据到主线程时。以下是它们的作用和使用方式。
1. Handler
Handler
是Android中用于在不同线程之间发送和处理消息的类。它主要用于将任务调度到某个特定的线程的消息队列中执行,典型的应用场景是主线程(UI线程)中进行UI的更新。
主要功能
- 发送消息 :通过
sendMessage()
或post()
方法将任务或数据发送到消息队列。 - 处理消息 :重写
handleMessage()
方法,在此方法中处理收到的消息。
java
Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
// 在这里处理消息
}
};
// 发送消息
Message msg = Message.obtain();
msg.what = 1;
handler.sendMessage(msg);
// 发送任务
handler.post(() -> {
// 在这里执行任务
});
2. Looper
Looper
是Android中实现消息循环的类。它将消息放入一个队列中,并循环处理队列中的消息。每个线程(特别是UI线程)可以创建一个Looper
对象,消息队列中的消息会被Looper
持续处理,直到线程结束。
使用方法
- 主线程(UI线程)默认已经有一个
Looper
对象。 - 子线程需要调用
Looper.prepare()
来创建一个Looper
,然后通过Looper.loop()
开始消息循环。
java
// 子线程的Looper
new Thread(() -> {
Looper.prepare(); // 初始化Looper
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 处理子线程的消息
}
};
Looper.loop(); // 开启消息循环
}).start();
3. Message
Message
是Android中用于在线程间传递数据的类。它可以包含少量数据,用于传递给Handler
进行处理。常用的字段包括what
、arg1
、arg2
和obj
。
主要字段
- what:用于消息的标识,可以是一个整型常量,用来区分不同类型的消息。
- arg1 和 arg2:消息中的附加数据。
- obj:可以附带一个任意对象。
java
// 子线程的Looper
new Thread(() -> {
Looper.prepare(); // 初始化Looper
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 处理子线程的消息
}
};
Looper.loop(); // 开启消息循环
}).start();
4. 关系
- Looper:管理消息队列并循环处理消息。
- Handler:发送和处理消息。
- Message:包含数据,用于在线程间传递。
java
Message msg = Message.obtain();
msg.what = 1; // 设置消息类型
msg.arg1 = 100;
msg.obj = "数据";
handler.sendMessage(msg);
总结
- Handler 和Message 可以通过Looper在不同线程间传递数据。
- 主线程默认有
Looper
,子线程需手动创建。 - 使用
Handler
可以简化线程间通信和UI更新的逻辑。