ANR (Application Not Responding)
1). Key Dispatch Timeout (8s)
framework/base/services/core/java/com/android/server/am/ActivityManagerService.java
按键或触摸事件在特定时间内无响应(origin:5s)
KEY_DISPATCHING_TIMEOUT = 8*1000
2) .Broadcast Timeout
BroadcastReceiver在特定时间内无法处理完成
BROADCAST_FG_TIMEOUT: 10s
BROADCAST_BG_TIMEOUT: 60s
按键和广播事件时间内未响应,时间限定定义在ActivityManagerService.java类中
3).Service Timeout (20s)——-小概率类型
Service在特定的时间内无法处理完成
service时间内未响应时间限定在ActiveServices.java类中
SERVICE_TIMEOUT = 20*1000;
2.ANR产生原因
1)应用进程有一个主线程(main thread)和一个信息队列(main message queue) main thead == activity thread
2)主线程负责处理像Draw、Listen、receive等UI事件
3)主线程负责从消息队列中取出信息并分发它
4)主线程在完成当前信息处理之前,不会再取信息队列中的信息
5)如果主线程在处理当前信息时卡住,没有及时分发,ANR就会出现
3.如何避免ANR
1):UI线程尽量只做跟UI相关的工作
2):耗时的工作(比如数据库操作,I/O,连接网络或者别的有可能阻碍UI线程的操作)把它放入单独的线程处理
3):尽量用Handler来处理UIthread和别的thread之间的交互
4.UI线程主要包括哪些?
1).Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), onClick()等
2).AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel等
3).Mainthread handler: handleMessage(), post*(runnable r)等
4).other