什么是 ANR
ANR(Application Not responding),即应用程序无响应,简单来说,就是用户界面突然卡住,无法响应用户的操作(比如触摸事件)。
Android 系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成 ANR。一般情况下,ANR 后会弹出一个提示框,告知用户当前应用无响应,用户可选择继续等待或者关闭应用。
出现场景
-
InputDispatching Timeout:5 秒内无法响应屏幕触摸事件或键盘输入事件。
-
BroadcastQueue Timeout :在执行前台广播(BroadcastReceiver)的
onReceive()
函数时 10s 没有处理完成,后台为 60s。 -
Service Timeout :前台服务 20s 内,后台服务在 200s 内没有执行完毕。
-
ContentProvider Timeout :ContentProvider的 publish 在 10s 内没进行完。
如何避免
基本的思路就是将 IO 操作在工作线程来处理,减少其他耗时操作和错误操作。比如网络请求、Socket 通信、SQL操作、文件读写和或者有可能阻塞 UI 线程的操作放在子线程。
ANR 分析
ANR 发生时 Logcat 会打印类似下面的日志:
/com.wuzy.anrtest I/zygote64: Thread[3,tid=6428,WaitingInMainSignalCatcherLoop,Thread*=0x7b3965ca00,peer=0x171c0020,