1. ANR概念
ANR(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。一般地,这时往往会弹出一个提示框,告知用户当前xxx未响应,用户可选择继续等待或者Force Close。
2. 哪些场景会造成ANR呢?
Service Timeout:前台服务在20s内未执行完成
BroadcastQueue Timeout:前台广播在10s内未执行完成
ContentProvider Timeout:内容提供者在publish过超时10s
InputDispatching Timeout:输入事件分发超时5s,包括按键和触摸事件
3. 如何避免ANR?
①不要在主线程上进行复杂耗时的操作,比如说发送接收网络数据、进行大量计算、操作数据库、读写文件等,这些需要采用异步操作
②Service中的耗时操作最好也是采用异步任务
③在设计及代码编写阶段避免出现出现死锁、死循环等不恰当情况
④一些避免、检测ANR的工具
StrictMode:用来检测代码中是否存在违规操作的工具类(检测主线程是否存在耗时操作)
BlockCanary:用来监控应用主线程的卡顿