ANR,是“ApplicationNotResponding”的缩写,即“应用程序无响应”。
如果应用程序主线程(即UI线程)在超时时间内对输入事件没有处理完毕,或者对特定操作没有执行完毕,就会出现ANR。
ANR产生的条件1.主线程:只有应用程序进程的主线程响应超时才会产生ANR
.超时时间:ANR的类型不同,超时时间也不同,但只要在这个时间上限内没有响应就会ANR
.用户输入/特定操作:用户输入是指按键、触屏等设备输入事件;特定操作是指BroadcastReceiver和Service的生命周期中的各个函数。产生ANR的上下文不同,报出ANR的原因也会不同。
ANR问题的类型1.Inputdispatching超时。
.BroadcastReceiver执行超时。
.Service各生命周期函数执行超时。
4.ContentProvider相关操作执行超时。
哪些属于主线程1.Activity:onCreate(),onResume(),onDestroy(),onKeyDown(),onClick(),etc
.AsyncTask:onPreExecute(),onProgressUpdate(),onPostExecute(),onCancel,etc
.Mainthreadhandler:handleMessage(),post*(runnabler),etc
二、ANR类型Inputdispatching超时1)用户输入事件处理超时
)窗口获取焦点超时
1.1用户输入事件处理超时
?原因:主线程对输入事件在5秒内没有处理完毕
?提示语:Reason:InUputdispatchingtimedout(Waitingbecausethefocusedwindowhasnotfinishedprocessingtheinputeventsthatwerepreviouslydeliveredtoit.)
?产生这种ANR的前提是要有输入事件,如果用户没有触发任何输入事件,即便是主线程阻塞了,也不会产生ANR,因为InputDispatcher没有分发事件给应用程序,当然也不会检测处理超时和报告ANR了。
1.窗口获取焦点超时
?原因:焦点应用在n秒内没有获得窗口焦点
?提示语:Reason:Inputdispatchingtimedout(Waitingbecausenowindowhasfocusbutthereisafocusedapplicationthatmayeventuallyaddawindowwhenitfinishesstartingup.)
超时时间定义在ActivityManagerService.java
0//Howlongwewaituntilwetimeoutonkeydispatching.
0staticfinalintKEY_DISPATCHING_TIMEOUT=5*;
04
05//Howlongwewaituntilwetimeoutonkeydispatchingduringinstrumentation.
06staticfinalintINSTRUMENTATION_KEY_DISPATCHING_TIMEOUT=60*;
BroadcastReceiver执行超时?原因:主线程在执行BroadcastReceiver的onReceive函数时,60秒内没有执行完毕
?提示语:Reason:BroadcastofIntent{act=android.net.wifi.WIFI_STATE_CHANGEDflg=0xcmp=网络客服北京中科医院曝光