ANR:即Appliaction Not Responding,在Android设备上,如果应用程序进程的主线程响应超时就会产生ANR,系统就会向用户展示一个提示框,用小米设备举例,基本提示内容为:“应用程序未响应”下面有两个按钮,一个是等待,一个是强制关闭。
ANR的常见类型为:
1.KeyDispatchimeout(5 seconds) 主要类型,案件或触摸事件在特定时间内无响应
2.BroadcastTimeout(10 seconds) BroadcastReceiver在特定时间内无法处理完成
3.ServiceTimeout(20 seconds) 小概率类型Service在特定的时间内无法处理完成
什么情况下会引发ANR:
- 在Android中应用程序的响应是靠Activity Manager和WindowManager系统服务监视的,当检测到以下情况中的一个时就会针对特定的应用程序显示ANR
1.应用进程的主线程,在五秒内没有响应事件(如:按下按钮没有响应)
2.BroadcastReceiver在10秒内没有执行完毕
3.应用进程的主线程在执行Service的各个生命周期函数时20s内没有处理完毕
造成以上情况的大致原因基本上就是主线程中存在耗时操作,或者线程阻塞、挂起、死循环等,当然也存在其他外在因素,比如cpu使用过高,或者文件读写频繁等等都会导致ANR的产生。
如何避免ANR的出现:
主线程如果需要做耗时操作时需要启子线程进行处理(如:网络请求、数据库操作等)
BroadcastReceiver中如果有耗时操作,可以放到service中处理