Handler没有消息的时候不是阻塞,而是等待状态。
如果消息队列没有消息的时候为什么不会ANR呢?我们来看看ANR的原理,ANR的原理时怎样子呢?ANR的机制时怎么样呢?
类型 | 前台 | 后台 |
---|---|---|
Service | 20s | 200s |
Broadcast | 10s | 60s |
provider | 10s | |
input | 5s |
Service前台为执行完20秒,后台200秒没有执行完ANR,还有广播前台10秒没执行完ANR,后台60秒,Provider10秒没执行完ANR,input,5秒钟没执行完ANR,也就是说我的按键事件,5秒钟没处理完就会ANR,很多时候ANR就是频繁地按键事件,点击屏幕,这个时候会导致ANR,这个ANR是消息产生的吗?
来看看Broadcast的流程。
每次我发送一个广播,这里涉及到Binder机制,发送一个消息给Binder之后,Binder会发送一个消息给ActivityManagerService,ActivityManagerService发现这里有一个广播要发送,于是它做了两件事情,第一件事情,埋下一个定时炸弹,这个定时炸弹就是我们这个广播需要在10秒钟执行完,于是乎就在这里做了一个10秒钟的定时器,同时通过Binder的方式去执行我的广播,用Binder去发送这个广播,把这个广播执行,执行完广播之后,回到这边system_server线程里面,system_server的Binder就会收到广播执行完的这一个通知,于是乎又创建了一个Binder,通过这个Binder发送一个消息给ActivityManagerService,然后告诉它,我的广播已经执行完了,那么这个时候我就把这个定时炸弹拆掉,如果定时炸弹10秒钟已经完成了,那么这时候就会爆炸,如果定时器事件到达之前拆除的动作没有执行完,于是乎就会爆炸,这个炸弹就是ANR。
所以这个ANR的所有的消息发送,这个ANR的显示都是message,所以ANR的时候并不是message没有执行,而是这个炸弹的自我保护意识,通过这些事件,让我们感受到手机的自我保护的一个事件,所以它跟handler是搭不上的东西。