概述
原因:
- 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发生的原因 和 原理所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复