2024年3月27日发(作者:)

主线程中的()一直无限循环为什么不会造成ANR?

引子:

正如我们所知,在android中如果主线程中进行耗时操作会引发ANR(Application

Not Responding)异常。

造成ANR的原因一般有两种:

1. 当前的事件没有机会得到处理(即主线程正在处理前一个事件,没有及时的完成或

者looper被某种原因阻塞住了)

2. 当前的事件正在处理,但没有及时完成

为了避免ANR异常,android使用了Handler消息处理机制。让耗时操作在子线程

运行。

因此产生了一个问题,主线程中的()一直无限循环检测消息队列中是否

有新消息为什么不会造成ANR?

源码分析

是主线程入口的类,这里你可以看到写Java程序中司空见惯的

main方法,而main方法正是整个Java程序的入口。

ActivityThread源码

public static final void main(String[] args) {

...

//创建Looper和MessageQueue

eMainLooper();

...

//轮询器开始轮询

();

...

}

()方法

while (true) {

//取出消息队列的消息,可能会阻塞