本文主要是介绍Android ANR总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
对于刚开始做Android的童鞋们,经常会遇到ANR(application not response ,应用程序无响应),下面我就把我工作中关于ANR的理解总结一下。
1、是什么引起了ANR?
简单来说,最常见的引起ANR的原因有以下这么几种:
1)RuntimeException,运行时异常,比如空指针(这个算是前期遇到的最多的),类型转换异常,数组越界等
2)在主线程中执行了高耗时的操作,例如文件的上传下载,图片的处理,对磁盘的读写等
3)OOM (内存溢出)
第一个原因很好理解,我主要说一下第二个在Android 3.0以后google要求所有的网络操作必须在子线程中进行,很好的避免了网络操作发生ANR的概率。在Android中不同的组件对ANR的响应时间要求不一样,具体的如下:
KeyDispatchTimeout(5 seconds) --主要是类型按键或触摸事件在特定时间内无响应
BroadcastTimeout(10 seconds) --BroadcastReceiver在特定时间内无法处理完成
ServiceTimeout(20 secends) --小概率事件 Service在特定的时间内无法处理完成
2、如何避免ANR的出现?
ANR的出现会大大减低用户的体验,所以我们在开发的时候必须要避免ANR的出现。
1)UI线程尽量只做跟UI相关的工作
2)耗时的操作(比如数据库操作,I/O,连接网络或者别的有可能阻塞UI线程的操作)把它放在单独的线程处理
3)尽量用Handler来处理UIThread和别的Thread之间的交互
4)释放一些连接,比如操作数据库的时候,处理图片的时候
5)合理的创建对象
3、出现ANR了如何排查?
其实前期出现最多的两种情况就是runtimeException和耗时操作了,RuntimeException 这种错误通过看as打印的log基本上都能快速的定位,然后在程序中多加判断就可以了。对于耗时操作其实在日志中也可以看到的,这个定位起来就相对困难。而对于内存溢出的ANR我们需要借助Android studio的monitor来分析,然后操作app,看内存的变化,在找到内存溢出的代码块,分析代码。
这篇关于Android ANR总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!