ANR:Application Not Responding,应用无响应,在一定时间内,用户的操作没有给出回应,就会导致ANR。
首先要明确一个概念:ANR只会出现在主线程中,也就是说Activity、Service、BroadcastReceiver、ContentProvider的生命周期方法都是在主线程中执行的,系统通过AMS和WMS对操作时间进行检测,超出时间就会报ANR,并且弹出对话框提示用户。
那是什么机制对方法执行时间进行检测呢,这个地方就涉及了Android消息机制的Looper对象了,内部有一个死循环,等待消息然后进行处理。
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}
....
}
这里就会存在问题,为什么Looper.loop()不会导致ANR,是因为loop()方法是为了维持当前app一直存活的,如果没有loop()方法,那么app处理完消息就直接退出应用了。ANR导致的原因是loop()中取出的某一条消息没有在规定的时间内处理完