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 /data/anr/traces.txt D:anr/拉出来;如果没有就只有使用adb bugreport来生成zip文件,解压得到trace.txt
  • log 查找 搜索 anr 会搜到一段异常信息
    ANR产生原因和处理_第1张图片

ANR处理

核心就是不要在主线程做耗时操作,应当将耗时操作异步执行,即放入其他线程执行。

你可能感兴趣的:(安卓开发,性能优化)