天天看點

Android中為什麼主線程不會因為Looper.loop裡的無限循環ANR?

在學習了Android Handler機制之後,産生了一個問題:為什麼在主線程中Looper.loop()運作了一個死循環,但是并沒有造成ANR?

首先:什麼情況下會發生ANR異常?

1、事件沒有得到處理

2、事件正在處理,但是沒有及時完成

例如:

Activity響應超過5秒

BroadcastReceiver響應超過10秒

Service響應超過20秒

解釋:

因為應用的整個生命周期就是運作在這個消息循環中的

Android是由事件驅動的,Looper.loop方法不斷的接受處理事件,每個點選、觸摸或者Activity每個生命周期的調用都是在Looper.loop方法的控制之下進行的,Looper.loop方法一旦結束,應用程式的生命周期也就結束了。

ActivityThread的main方法主要就是産生一個消息循環支援應用打開後一直運作,一旦退出消息循環,那麼應用就退出了。當隊列中沒有事件需要處理時,主線程的Looper.loop方法可能會引起主線程阻塞,但隻要消息循環沒有被阻塞,就一直能處理事件就不會産生ANR異常。

繼續閱讀