这解释这个问题我们得知道Looper.loop()里的无限循环和ANR分别是什么?
ANR 应用无响应,有两种情况会导致ANR
(1)事件没有得到处理
(2)事件正在处理,但是没有及时完成
所以说在实际使用中Activity生命周期onCreate/onStart/onResume等方法中做了耗时操作会导致ANR。
这也是以下情况会导致ANR的根本原因
Activity响应时间超过5s
Broadcast处理时间超过10s
Service处理时间超过20s
我们再说说Looper.loop()中的无限循环
loop中的无限循环是从MessageQueue中去取msg,如果没有msg的话,线程就进入等待阻塞状态,也就是进入休眠状态,释放CPU资源,等有消息的话,线程就会被唤醒。
这边需要理解的是,等待阻塞和卡死是两个意思,卡死是CPU一直在执行任务,没时间执行别的任务,而等待阻塞是指线程在休眠,如果此时要执行任务也是可以执行的,比如Handler.sendMessage,只是如果不能满足条件,还是阻塞状态,不能执行后面的代码。
至于怎么阻塞和唤醒看Android消息循环机制(二)Meassage、MessageQueue源码解析
这种消息循环机制是Android的基础,正是这种机制的存在让主线程存活着,这样app才能存活着。
所以从上面的描述中,我们就知道ANR和loop中的无限循环是两个概念,本身没有直接的联系。
【Android面试】主线程中的Looper.loop()一直无限循环为什么不会造成ANR?
Android中为什么主线程不会因为Looper.loop里的无限循环ANR?