ANR发生的原因 和 原理

原因:

  • ANR,即application not responding,程序未响应
  • 在主线程执行了比如数据库或者网络的耗时操作
  • 其他进程占用了CPU导致本进程得不到CPU时间片,例如其他进程频繁读写
  • 细分:
    • 耗时网络操作
    • 大量数据读写
    • 数据库操作
    • 硬件操作(例如Camera)
    • 调用Thread的join()、sleep()、wait()方法,或者等待线程锁
    • service binder的数量达到上限
    • service忙导致超时未响应
    • 其他线程有锁,导致主线程等待超时
    • 其他线程终止或者崩溃导致主线程等待超时

原理:

  • 在UI线程
  • 发生了输入(按键、触摸屏幕)或者调用了Servivce或者BoardcastReceriver的生命周期函数
  • 主线程超过5秒没有将输入事件处理完毕
  • 主线程在执行BroadcastReceiver的onReceive()函数时10秒内没有处理完毕
  • 主线程在Service的各个生命周期函数时20秒内没有处理完毕

避免方法:

  • 避免在主线程执行耗时操作
  • BoardcastReceiver要执行耗时操作时应启动一个service,将耗时操作交给service完成
  • 避免在IntentReceiver里启动一个Activity,因为它会创建一个新的画面,并从用户当前运行的程序上抢夺焦点。如果应用在相应Intent广播时需要显示画面,应该使用Notification Manager实现。

    参考:http://www.jianshu.com/p/7fd95bc2a55c

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值