什么是ANR?
ANR全称是application not response,也就是应用程序未响应,Android设计ANR的用意的话,是这个系统它通过与之交互的组件,像activity、service这些组件以及用户的交互就是我们的触摸、滑动、点击,对它们之间的交互进行一个超时监控,以判断我们的应用进程是不是有出现了卡死或者响应过慢的这样的一个状态
ANR产生的条件?
- 主线程
- 超时时间:产生ANR的上下文不同,超时时间也会不同
- 输入事件/特定操作:输入事件是指按键、触屏等设备输入事件;特定操作是指BroadcastReceiver和Service的生命周期中的各个函数
ANR产生的原因或情况?
- 主线程对输入事件在5秒内没有处理完毕
- 主线程在执行BroadcastReceiver的onReceiver函数时10秒内没有执行完
- 主线程在执行Service的各个生命周期函数时20秒内没有执行完毕
根本原因:
- 应用进程自身引起的,比如:主线程阻塞、挂起、死循环,执行耗时操作等;
- 其他线程引起的,比如:其他线程CPU占用率过高,导致当前应用进程无法抢占到CPU时间片。常见问题如文件读写频繁,io处理CPU占用率过高,导致当前应用出现ANR;
怎么避免ANR?
- 主线程需要做耗时操作时必须启动子线程处理
- 子线程尽量使用Android提供的API,比如HandlerThread,AsyncTask,性能会更高
- Broadcast Receiver中如果有耗时操作,可以放在service中来处理
- 在后台或子线程处理耗时操作时,可以在前台界面显示某些动画或者进度条,来使用户的体验相对来说 不是太差