Android中为什么主线程不会因为Looper.loop里的无限循环ANR?

mac2024-05-09  3

这解释这个问题我们得知道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?

最新回复(0)