Handler的消息队列
时间: 2024-01-02 07:13:27 浏览: 38
Handler的消息队列是一个消息阻塞队列,在Android系统中,APP启动后会进入一个死循环,不断读取MessageQueue中的消息,有消息则立即处理,没有消息则阻塞。Android的View绘制、事件响应(点击、触摸屏幕等)都是通过Handler将消息发送到主线程的消息队列中,最终分发到指定的Handler处理消息。当消息被加入到消息队列中时,会根据消息中的成员变量target(即Handler)来分发到对应的Handler处理。通过Handler对象,我们可以封装Message对象,并通过sendMessage(msg)将Message对象添加到消息队列中。当消息队列循环到该Message时,会调用对应的Handler的handleMessage()方法对其进行处理。因此,我们可以编写一个类继承自Handler,并在handleMessage()方法中处理我们需要的操作。
相关问题
android handler消息队列阻塞的时候为什么不会产生ANR
当 Android Handler 的消息队列阻塞时,由于消息处理是在主线程(也称为 UI 线程)中进行的,因此不会直接导致 ANR(Application Not Responding)问题。
ANR 是指应用程序在主线程中无法响应用户输入事件或系统事件的情况,导致用户无法与应用进行交互,系统可能会显示一个对话框询问用户是否关闭应用。ANR 通常发生在主线程执行耗时操作或阻塞事件循环时。
Android 系统会监测主线程的响应性,如果发现主线程在特定时间段内没有响应用户事件或系统事件,就会触发 ANR。这个时间段的阈值是5秒钟,但实际可能会有一定的容忍度。
当 Handler 的消息队列阻塞时,主要是指消息队列中没有新的消息需要处理,但主线程仍然在等待下一个消息的到来。这种情况下,主线程并没有执行任何耗时操作或阻塞事件循环,因此不会触发 ANR。
然而,如果在主线程中执行耗时操作或者阻塞事件循环,导致主线程无法及时处理消息队列中的消息,就有可能触发 ANR。所以,在开发中要注意避免在主线程中执行耗时操作,可以使用 Handler 的 post 方法将耗时操作放到 Runnable 中,或者使用 AsyncTask、Thread、HandlerThread 等方式来在子线程中执行。这样可以保持主线程的响应性,避免触发 ANR。
handler 消息
Handler是Android中常用的消息处理机制,可以用来在不同线程之间传递和处理消息。Handler的基本原理是:创建一个Handler对象,将该对象与一个Looper对象绑定,然后在不同的线程中发送消息到该Handler对象,Handler会将这些消息加入到消息队列中,并通过Looper对象来循环处理这些消息。
下面是一个简单的使用Handler发送和处理消息的示例代码:
```
// 创建Handler对象,并与主线程的Looper对象绑定
Handler handler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
// 处理消息1
break;
case 2:
// 处理消息2
break;
default:
break;
}
}
};
// 在子线程中发送消息到主线程的Handler对象
new Thread(new Runnable() {
@Override
public void run() {
Message message = Message.obtain();
message.what = 1;
handler.sendMessage(message);
}
}).start();
```
在这个示例中,我们创建了一个Handler对象,并在主线程中与主线程的Looper对象绑定。然后在子线程中发送一个消息到主线程的Handler对象,主线程的Handler对象会接收到这个消息,并调用handleMessage()方法来处理这个消息。