我是靠谱客的博主 温柔银耳汤,最近开发中收集的这篇文章主要介绍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

最后

以上就是温柔银耳汤为你收集整理的ANR发生的原因 和 原理的全部内容,希望文章能够帮你解决ANR发生的原因 和 原理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部