一、ANR是什么?
ANR全稱Application Not Responding即應(yīng)用程序無響應(yīng)闽撤。在Android中如果應(yīng)用程序有一段時間無法響應(yīng)用戶操作端辱,系統(tǒng)會彈出彈窗梁剔,讓用戶選擇是繼續(xù)等待還是強制關(guān)閉程序。一款良好應(yīng)用APP是不應(yīng)該出現(xiàn)這個彈窗的舞蔽。
二荣病、ANR的產(chǎn)生原因
ANR產(chǎn)生原因和類型有以下幾種:
1、Activity在5秒鐘之內(nèi)無法響應(yīng)屏幕觸摸事件或鍵盤輸入事件就會產(chǎn)生ANR渗柿。
KeyDispatchTimeout
Reason:Input event dispatching timed out
2个盆、BroadcastReceiver在10秒鐘之內(nèi)還未執(zhí)行完成就會產(chǎn)生ANR。
BroadcastTimeout
Reason:Timeout of broadcast BroadcastRecord
3做祝、Service各個生命周期在20秒鐘之內(nèi)沒有執(zhí)行完成就會產(chǎn)生ANR砾省。
ServiceTimeout
Reason:Timeout executing service
4、ContentProvider在10秒鐘之內(nèi)沒有執(zhí)行完成就會產(chǎn)生ANR混槐。
ContentProviderTimeout
Reason:timeout publishing content providers
在以上這幾種原因中出現(xiàn)最多的一般是第一種编兄,而且往往都是因為在寫代碼時不注意,在主線程做了耗時的操作声登。
三狠鸳、在Activity的onCreate方法里調(diào)用sleep方法或者說做耗時操作揣苏,不一定會產(chǎn)生ANR。
其實從ANR本身意為應(yīng)用程序沒有響應(yīng)件舵,耗時操作本身是不會產(chǎn)生ANR的卸察,導(dǎo)致ANR的根本還是應(yīng)用程序無法在一定時間內(nèi)響應(yīng)用戶的操作。
所以若主線程被耗時操作占用了铅祸,主線成程無法對下一個操作進行響應(yīng)才會ANR坑质,沒有需要響應(yīng)的操作自然就不會產(chǎn)生ANR,或者應(yīng)該這樣說:主線程做耗時操作临梗,非常容易引發(fā)ANR涡扼。