Android ANR原因以及开发时如何预防
2017-12-05 15:03
513 查看
经常可以在Android系统上发现ANR异常响应的问题。故了解一下ANR出现的原因
一、
Android系统中,应用程序的响应是由ActivityManager 和 WindowManger系统服务监视的,当它检测到以下情况时,Android就会针对特定的应用程序显示ANR:
1. 主线程超过5S没有响应输入事件。(主要类型)KeyDispatchTimeout(5 seconds)
2. BroadcastReceiver 没有在10S 内返回。例如发送广播更改“控件属性”超过10S无效
3. Service在20S 内没有无法完成处理(小概率)
二、
什么是主线程(UI线程):
当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。
三、
为什么UI线程没有响应:
1. 当前的事件没有机会得到处理
2. 当前的事件正在处理,但是没有及时完成
四、
如何避免ANR:
1. 运行在主线程里的任何方法都尽量少的做事情,特别是Activity的关键生命周期方法,再更新UI时尽量用handler进行。
2. 避免在BroadcastReceiver中做耗时的操作或者计算,如果响应广播时要做耗时操作的话可以使用“service”来进行。
五、
容易出现ANR的场景:
1. 耗时的网络访问
2. 大量的数据库读写操作
3. 系统硬件操作
4. 调用thread_join() / Sleep() / Wait() 或者等待locker的时候
5. 同时运行的Service binder达到上线(binder主要是用来进程间通信的,但也可用在和本地service通信)
6. Service响应超时
7. 非主线程持有lock,导致主线程等待lock超时
8. 非主线程终止或者崩溃导致主线程一直等待
一、
Android系统中,应用程序的响应是由ActivityManager 和 WindowManger系统服务监视的,当它检测到以下情况时,Android就会针对特定的应用程序显示ANR:
1. 主线程超过5S没有响应输入事件。(主要类型)KeyDispatchTimeout(5 seconds)
2. BroadcastReceiver 没有在10S 内返回。例如发送广播更改“控件属性”超过10S无效
3. Service在20S 内没有无法完成处理(小概率)
二、
什么是主线程(UI线程):
当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。
三、
为什么UI线程没有响应:
1. 当前的事件没有机会得到处理
2. 当前的事件正在处理,但是没有及时完成
四、
如何避免ANR:
1. 运行在主线程里的任何方法都尽量少的做事情,特别是Activity的关键生命周期方法,再更新UI时尽量用handler进行。
2. 避免在BroadcastReceiver中做耗时的操作或者计算,如果响应广播时要做耗时操作的话可以使用“service”来进行。
五、
容易出现ANR的场景:
1. 耗时的网络访问
2. 大量的数据库读写操作
3. 系统硬件操作
4. 调用thread_join() / Sleep() / Wait() 或者等待locker的时候
5. 同时运行的Service binder达到上线(binder主要是用来进程间通信的,但也可用在和本地service通信)
6. Service响应超时
7. 非主线程持有lock,导致主线程等待lock超时
8. 非主线程终止或者崩溃导致主线程一直等待
相关文章推荐
- Android ANR原因以及开发时如何预防
- 【Android游戏开发二十一】Android os设备谎言分辨率的解决方案!以及简单阐述游戏引擎如何使用!
- 如何安装Android开发工具以及配置
- android笔记2——anr产生的原理以及如何避免
- Android应用程序如何避免内存泄漏以及如何检查泄漏原因
- (转)【Android游戏开发二十一】Android os设备谎言分辨率的解决方案!以及简单阐述游戏引擎如何使用!
- 【Android游戏开发二十一】Android os设备谎言分辨率的解决方案!以及简单阐述游戏引擎如何使用!
- android开发学习(四)——anr产生的原理&如何避免,android消息机制入门, 网络图片查看器
- Android开发中的ANR问题如何避免?
- Android anr 产生的原因和如何避免
- android 开发如何将数据封装成对象以及从对象中获取出来
- 【Android游戏开发二十一】Android os设备谎言分辨率的解决方案!以及简单阐述游戏引擎如何使用!
- Android开发中关于如何解决Fragment中弹出键盘会把底部菜单栏顶上去的问题以及返回键的监听问题
- android开发中如何查看当前eclipse 是否已经安装ADT以及这个ADT的版本
- 【Android游戏开发二十一】Android os设备谎言分辨率的解决方案!以及简单阐述游戏引擎如何使用!
- Android 开发学习手记(二):PullToRefresh如何滚动到最顶部?以及PullToRefresh的实质。
- Android开发_如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
- 【Android游戏开发二十一】Android os设备谎言分辨率的解决方案!以及简单阐述游戏引擎如何使用!
- 【Android游戏开发二十一】Android os设备谎言分辨率的解决方案!以及简单阐述游戏引擎如何使用
- 【基于Windows系统】教你如何在Android中使用JNI以及NDK开发环境搭建