Android中为什么主线程不会因为Looper.loop()里的死循环卡死?

这个问题很简单,概念理解问题,不需要把app启动源码牵扯进来搞得很复杂。
程序无响应:主线程执行任务时间较长,导致其他需要立刻在主线程处理的事件无法得到处理。
线程阻塞:线程处于等待状态
线程结束:线程的run方法返回

阻塞与程序无响应没有必然关系,虽然主线程在没有消息可处理的时候是阻塞的,但是只要保证有消息的时候能够立刻处理,程序是不会无响应的。
阻塞与线程退出也没有必然联系,线程完全可以在不阻塞的情况下死循环,同样达到不退出的效果。阻塞考虑到节约系统资源而做的处理,和线程退出没有关系。

ActivityThread的main方法主要就是做消息循环,一旦退出消息循环,那么你的应用也就退出了,Looer.loop()方法可能会引起主线程的阻塞,但只要它的消息循环没有被阻塞,能一直处理事件就不会产生ANR异常。

消息队列是一个无限循环,为什么无限循环不会ANR?因为可以说,应用的整个生命周期就是运行在这个消息循环中的,安卓是由事件驱动的,Looper.loop不断的接收处理事件,每一个点击触摸或者Activity每一个生命周期都是在Looper.loop的控制之下的,looper.loop一旦结束,应用程序的生命周期也就结束了。我们可以想想什么情况下会发生ANR,第一,事件没有得到处理,第二,事件正在处理,但是没有及时完成,而对事件进行处理的就是looper,所以只能说事件的处理如果阻塞会导致ANR,而不能说looper的无限循环会ANR

你可能感兴趣的:(android基础总结)