ANR即Application Not Responding应用无响应,一般在ANR的时候会弹出一个应用无响应对话框。
1 查看Android anr的出现:
需要在开发者选项中设置了“显示所有应用无响应-为后台应用显示无响应ANR对话框”
2 查看Android anr的日志
1插上Android手机,使用adb logcat -v time 获取当前Android app anr日志,日志中查找anr和包名关键字
2位于/data/anr/文件夹下面,trace文件,我们可以通过ANR产生的traces日志文件分析应用在哪里产生了ANR,以此来有效解决应用中的ANR。
【是Android Davik虚拟机在收到异常终止信号时产生的,最常见的一个触发条件就是Android应用中产生了FC(force close)。由于该文件的产生是在DVM中的,所以只有运行DVM实例的进程才能产生该文件,也就是说只有Java代码才能产生该文件,App应用的Native层(如Android Library、用c/c++编译的库)即使异常也不会产生ANR日志文件。】
3为什么会产生ANR
在Android里,应用程序的响应是由ActivityManager和WindowManager服务系统服务监视的,当检测到下面三种情况的任何一种时,Android就会针对特定的应用程序显示ANR对话框。
- Activity的UI在5秒内没有响应输入事件(例如,按键按下,屏幕触摸)–主要类型
- BroadcastReceiver在10秒内没有执行完毕
- Service在特定时间内(20秒内)无法处理完成–小概率类型
- 造成ANR的原因有很多,无论是在Activity或者BroadcastReceiver还是在Service,我们看到都是在主线程中操作引起的ANR,因此我们应该避免在主线程做太多耗时的操作,网络请求不用说了,Android4.0以后就禁止在主线程成执行请求了,除此之外就是要注意如下几个方面:
- 主线程频繁进行IO操作,比如读写文件或者数据库;
- 硬件操作如进行调用照相机或者录音等操作;
- 多线程操作的死锁,导致主线程等待超时;
- 主线程操作调用join()方法、sleep()方法或者wait()方法;
- system server中发生WatchDog ANR;
- service binder的数量达到上限。
- 4如何避免ANR
- 避免在主线程进行复杂耗时的操作,特别是文件读取或者数据库操作;
- 避免频繁实时更新UI;
- BroadCastReceiver 要进行复杂操作的的时候,可以在onReceive()方法中启动一个Service来处理;
- 避免在IntentReceiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广 播时需要向用户展示什么,你应该使用Notification Manager来实现。
- 在设计及代码编写阶段避免出现出现同步/死锁或者错误处理不恰当等情况。