handler 和 handlerthread
时间: 2023-09-16 17:15:35 浏览: 97
在 Android 中,Handler 和 HandlerThread 是两个常用的类来实现异步消息处理。
Handler 可以用于将任务从一个线程传递到另一个线程。它可以将消息或者 Runnable 对象发送到消息队列中,然后由 Looper 逐一取出执行。例如,我们可以在主线程中创建一个 Handler 对象,并将消息发送到它所在的工作线程中,这样就可以在工作线程中执行这些任务。
HandlerThread 是一个带有 Looper 的线程,它可以用于创建一个可处理消息的线程。我们可以将 HandlerThread 的实例传递给 Handler 的构造函数,这样就可以在 HandlerThread 中执行任务。使用 HandlerThread 的好处是可以避免在主线程中进行耗时操作,从而提高应用程序的性能。
总之,Handler 和 HandlerThread 都可以用于异步消息处理,它们的使用可以让我们更加高效地处理耗时操作,从而提高应用程序的响应速度和用户体验。
相关问题
请结合示意图说明如何通过 Looper,Handler和HandlerThread 的异步消息处理机制来完成从主线程安排多张图片的下载任务以及图片下载完成后如何实现界面刷新。(8分)
在Android中,使用Looper、Handler和HandlerThread来实现主线程之外的任务异步处理非常常见。这有助于防止UI线程阻塞,提高应用性能。以下是利用这个机制来下载多张图片并更新UI的步骤:
1. **创建HandlerThread**:
- 首先,创建一个新的`HandlerThread`,比如叫它`DownloadThread`。这是因为HandlerThread会包含一个单独的Looper,可以在其中运行独立的消息循环。
```java
HandlerThread downloadThread = new HandlerThread("ImageDownloader");
downloadThread.start();
```
2. **Handler on DownloadThread**:
- 在`DownloadThread`中,创建一个`Handler`实例,它是Looper关联的。这样,当我们发送消息到这个Handler,它会在下载线程中处理。
```java
final Handler downloadHandler = new Handler(downloadThread.getLooper()) {
//...
};
```
3. **下载图片的Task**:
- 在`downloadHandler`的`handleMessage()`方法中,你可以编写一个用于下载图片的Runnable任务,并将它添加到队列中等待处理。
```java
void downloadImage(String imageUrl) {
// 创建一个下载任务
DownloadTask task = new DownloadTask(imageUrl);
// 使用Handler.sendMessageDelayed()发送任务到队列,指定延迟时间避免立即阻塞主线程
downloadHandler.sendMessageDelayed(downloadHandler.obtainMessage(), 0); // 立即执行
}
private class DownloadTask implements Runnable {
//...
}
```
4. **图片下载完成**:
- 当图片下载任务在`DownloadThread`中完成,`DownloadTask`应该回调给`downloadHandler`。
```java
public void onPostExecute(Bitmap bitmap) {
// 将Bitmap放入一个Message对象
Message message = downloadHandler.obtainMessage();
Bundle data = new Bundle();
data.putParcelable("image", bitmap);
message.setData(data);
downloadHandler.sendMessage(message);
}
```
5. **刷新UI**:
- 在主线程的`Handler`中,我们监听`downloadHandler`的消息,当接收到下载完成的消息时更新UI。
```java
Handler mainThreadHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
if (msg.getData().containsKey("image")) {
Bitmap bitmap = msg.getData().getParcelable("image");
// 更新UI显示图片
imageView.setImageBitmap(bitmap);
}
}
};
// 主线程中设置接收下载完成消息
downloadHandler.setCallback(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
return true; // 允许下载Handler处理消息
}
});
```
Handler类和HandlerThread类有什么不一样
Handler和HandlerThread是Android中的两个不同的类。
Handler是一个处理程序,用于处理与线程相关的消息。它允许您将消息发送到消息队列以供处理。您可以将Handler与任何线程关联,并使用它来发送消息到该线程。例如,您可以将Handler与UI线程关联,以便在后台线程中执行某些工作后更新UI。
HandlerThread是一个具有Looper的线程,它可以用于执行与UI线程不同的后台任务。它允许您轻松地在后台线程上创建一个循环,并使用Handler将消息发送到该线程。因此,HandlerThread是一种方便的方式,可以在单独的线程上执行长时间运行的任务,而不会阻塞UI线程。与Handler不同,HandlerThread包含一个Looper,因此您不需要手动创建一个Looper并将其与Handler关联。
因此,Handler和HandlerThread是不同的类别,Handler用于处理消息,而HandlerThread用于在后台线程上执行任务。
阅读全文