ANR产生原因和处理
ANR定义
ANR是Application Not Responding的缩写,指应用无响应。这是Android设计的一种机制,希望我们在其规定时间内完成动作,如果没有完成,给用户提示某一过程耗时太长。
ANR产生原因
接着上面所说,系统希望我们在其规定时间内完成动作,也就是它写入了一些时间配置,超过这个配置的时间就弹出提示框。有以下几种:
- KeyDispatchTimeout输入事件(键盘输入KeyEvent和MotionEvent触摸事件)5s无响应;
- BroadcastTimeout广播10s无响应;
- ServiceTimeout服务20s无响应;
- ContentProvider超时,不过很少见。
一般情况都是由于我们在主线程做了耗时操作,包括:
- 网络请求,IO操作,数据库操作
- 打开wifi(因为跨进程操作,有可能wifiserver那边处理超时)
- SharedPreferences的commit操作,但事实证明,频繁调用apply方法也可能引起ANR.参考剖析 SharedPreference apply 引起的 ANR 问题
- 数据库查询语句,在数据库量巨大时可能产生
- bitmap的处理
- 等等
ANR排查
- BlockCanary
- 追踪trace.txt文件,一般设备在/data/anr下面,需要root才能adb pull拉出来,如果没有就只有使用adb bugreport来生成zip文件,解压得到trace.txt
- log 查找 搜索 anr 会搜到一段异常信息
ANR处理
核心就是不要在主线程做耗时操作,应当将耗时操作异步执行,即放入其他线程执行。