Android中为什么主线程不会因为Looper.loop()里的死循环导致(anr)卡死?
首先主线程中的死循环不会导致app anr,它会使得主线程阻塞在messagequeue的next中的nativePollOnce()方法里,当有消息来时就会唤醒主线程进行消息处理,即使主线程在休眠的时候也有其他的线程(applicationthread)在处理事件。
为什么主线程中会采用死循环呢?
线程是一段可执行的代码,当可执行代码执行完成后,线程生命周期便该终止了。而对于主线程,我们是绝不希望会被运行一段时间就退出,所以采用死循环保证它不会被退出。
而anr原因是,主线程中messagequeue中一个message的处理时间过长,导致接下来的消息无法处理,比如说一个消息的处理时间超过了5秒,导致用户的输入无法响应,才会出现anr。
(当一个android主线程被创建的时候,同时会有一个Looper对象被创建,而这个Looper对象会实现一个MessageQueue(消息队列),当我们创建一个handler对象时,而handler的作用就是放入和取出消息从这个消息队列中)