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处理

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值