在學習了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異常。