一、概述
ANR(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。一般地,这时往往会弹出一个提示框,告知用户当前xxx未响应,用户可选择继续等待或者Force Close。
那么哪些场景会造成ANR呢?
- Service Timeout:服务在20s内未执行完成;
- BroadcastQueue Timeout:比如前台广播在10s内执行完成
- ContentProvider Timeout:内容提供者执行超时
- inputDispatching Timeout: 输入事件分发超时5s,包括按键分发事件的超时。
ANR的可能原因
如果从根源上划分的话,导致ANR的原因有如下几点:
1.IO操作,如数据库、文件、网络
2.CPU不足,一般是别的App占用了大量的CPU,导致App无法及时处理
3.硬件操作,如camera
4.线程问题,如主线程被join/sleep,或wait锁等导致超时
5.service问题,如service忙导致超时无响应,或service binder的数量达到上限
6.system server问题,如WatchDog发现ANR
避免ANR:
- UI线程尽量只做跟UI相关的工作
- 耗时的工作()比如数据库操作,I/O,网络操作),采用单独的工作线程处理
- 用Handler来处理UIthread和工作thread的交互