Handler 类在 Android 中用于在不同线程之间传递消息和执行代码。它提供了两种主要的方式来执行任务:通过 post 方法和通过 sendMessage 方法。这两种方法有不同的使用场景和特点。
post 方法
方法
- post(Runnable r)
- postDelayed(Runnable r, long delayMillis)
- postAtTime(Runnable r, long uptimeMillis)
Handler handler = new Handler(Looper.getMainLooper());
// 立即执行
handler.post(new Runnable() {
@Override
public void run() {
// 在主线程中执行的代码
Log.d("Handler", "Runnable executed");
}
});
// 延迟执行
handler.postDelayed(new Runnable() {
@Override
public void run() {
// 在主线程中执行的代码
Log.d("Handler", "Runnable executed after delay");
}
}, 2000); // 延迟2秒
特点
- 直接执行代码:Runnable 直接包含要执行的代码块,不需要额外的封装。
- 简单易用:对于简单的任务,使用 Runnable 更加直观和简洁。
- 不需要消息传递:Runnable 不涉及消息的创建和处理,直接将代码提交给 Handler 执行。
- 适用于直接执行任务:post 方法适用于需要在特定线程(通常是主线程)上执行任务的场景。
sendMessage 方法
方法
- sendMessage(Message msg)
- sendMessageDelayed(Message msg, long delayMillis)
- sendMessageAtTime(Message msg, long uptimeMillis)
Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
// 处理消息1
Log.d("Handler", "Message 1 received");
break;
case 2:
// 处理消息2
Log.d("Handler", "Message 2 received");
break;
default:
super.handleMessage(msg);
}
}
};
// 创建消息
Message message = handler.obtainMessage(1);
handler.sendMessage(message);
// 延迟发送消息
Message delayedMessage = handler.obtainMessage(2);
handler.sendMessageDelayed(delayedMessage, 2000); // 延迟2秒
特点
- 消息传递:Message 允许在不同线程之间传递数据。可以通过 Message 的 what、arg1、arg2 和 obj 字段传递不同类型的数据。
- 灵活性:Message 适用于需要传递复杂数据或需要区分多种任务的场景。
- 需要处理消息:需要在 Handler 的 handleMessage 方法中处理接收到的消息。
- 适用于复杂任务:sendMessage 方法适用于需要传递数据并在接收端进行处理的场景。
使用场景
- post 方法 适用于简单的任务,例如在主线程中更新 UI,不需要传递复杂数据。
- sendMessage 方法 适用于需要在不同线程之间传递数据,或需要区分和处理多种任务的场景。
区别总结
Android 之 Handler
HandlerThread 和 Handler 区别
Android之Handler是如何保证延迟发送的