一、概述
-
ANR(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。一般地,这时往往会弹出一个提示框,告知用户当前xxx未响应,用户可选择继续等待或者Force Close。
-
原因
-
Service Timeout:比如前台服务在20s内未执行完成;
-
BroadcastQueue Timeout:比如前台广播在10s内未执行完成
-
ContentProvider Timeout:内容提供者,在publish过超时10s;
-
InputDispatching Timeout: 输入事件分发超时5s,包括按键和触摸事件。
-
-
发ANR的过程可分为三个步骤: 埋炸弹, 拆炸弹, 引爆炸弹
-
常见出现ANR的原因
-
应用在主线程上进行长时间的计算。
-
应用在主线程上执行耗时的I/O的操作。
-
主线程处于阻塞状态,等待获取锁。
-
主线程与其他线程之间发生死锁。
-
主线程在对另一个进程进行同步Binder调用,而后者需要很长时间才能返回。(如果我们知道调用远程方法需要很长时间,我们应该避免在主线程调用)
-
-
-
ANR发生以后,在Logcat中有相应的日志输出,并且会在 /data/anr/
-