Android ANR
前言
ANR:Application Not Responding,应用程序无响应
一、ANR产生的原因
Android系统中的AMS(ActivityManagerService) 和 WMS(WindowManagerService)会检测App的响应时间,如果App的主线程(UI线程)没有在规定的时间内处理完相应的工作,就会出现ANR警告。
以下四个条件可以产生ANR:
InputDispatching Timeout: 5s内无法响应屏幕触摸事件或键盘输入事件。
BroadcastQueue Timeout: BroadcastReceiver的事件(onRecieve方法)在规定时间内没处理完成(前台规定时间:10s,后台规定时间:60s)。
Service Timeout: 规定时间未完成启动 Timeout executing service(前台:20s 后台:200s)。
ContentProvider Timeout: ContentProvider的publish在10s内没进行完
二、如何尽量避免ANR?
-
尽量避免在主线程(UI线程)中做耗时工作,耗时工作尽量放在子线程中
-
尽量用Handler来处理UI Thread和别的Thread交互
-
实在绕不开主线程,可以尝试通过Handler延迟加载;
-
广播中如果有耗时操作,建议放在IntentService中去执行,或者通过goAsync() + HandlerThread分发执行。