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) {
//取出消息队列的消息,可能会阻塞
发布评论