概述
ANR
1、什么是ANR(Application Not Responding)
主线程超过五秒未响应会出现ANR,会让用户可以选择等待,或关闭运行
2、造成ANR的主要原因
应用程序的相应性是由Activity Manager和WindowManager系统服务监视的
当他检测出主线程耗时操作超过五秒或者BoardcastReceiver操作超过十秒的时候会出现
Android中那些操作是在主线程呢?
1.Activity的所有生命周期回调都是执行在主线程
2.Servi默认执行在主线程的
3.BroadcaseReceiver的onReceive回调是执行在主线程的
4.没有使用i县城的looper的Handler的handleMessage,post(Runnable)是执行在主线程的
5.AsyncTask的回调中除了dolnBackground(后台操作),其他都是执行在主线程中的
主要原因:
1.在主线程中做了耗时操作
2.
3、如何结局ANR
1、在AsyncTask中处理IO操作
2、使用Thread或者HandlerThread提高优先级(一定要提高优先级)
3、用Handler处理耗时操作
4、四大组件不做任何耗时操作
OOM
1、什么是OOM(内存溢出)
当前占用的内存加上我们申请的内存资源超过了Dalvik虚拟机的最大内存限制就会抛出Out of memory异常
当前占用内存和申请的占用内存超过了Dalvik虚拟机的最大内存的限制,就会OOM
2、一些容易混淆的概念
内存溢出:
就是OOM,当前占用内存和申请的占用内存超过了Dalvik虚拟机的最大内存的限制,就会抛出OOM异常
内存抖动:
短时间内创建大量对象,然后立刻释放,瞬间产生的对象就会很快被回收,造成对内存的压力,就会触发更大的GC回收,造成堆内存的压力
内存泄漏:
内存泄露危害的是内存泄露的堆积,这会最终消耗尽系统所有的内存。一次性内存泄露并没有什么危害,因为它不会堆积,而隐式内存泄露危害性则非常大,因为较之于常发性和偶发性内存泄露它更难被检测到。
常发性内存泄漏
就是在项目中,有内存泄漏的代码块被多次执行的时候,每一次的执行都会导致内存泄漏
偶发性内存泄漏
一次性内存泄漏
就是在代码块中,有内存泄漏的地方,执行且只执行一次,这种内存泄漏只会发生一次,危害较小
隐式内存泄漏
这种内存泄漏是很难被检测出来的,因为在一个项目中,每隔一段时间就会进行内存释放,这段时间可长可短,但是如果长时间不释放内存的话,可能会导致系统的内存被消耗完
3、如何解决OOM
有关bitmap
1 图片显示:当显示缩略图的时候,最好不要调用网络请求加载大图,因为加载大图会导致内存不够用
2 及时释放内存:Android有自己的内存回收机制(Java的内存回收机制)会不定期的回收掉不使用的内存
3 图片压缩:有时候会加载超出系统内存的图片,这时候就对图片进行压缩
4 inBitmap属性:会自己占个内存区域放这个图片,每次用的时候就会调用这个区域的图片,这样就会避免每次重新加载时候图片会太大而导致内存溢出
5 捕获异常:捕获异常捕获的是ERROR属性,不能捕获Exception
其他方法
listview:convertview/lru(三级缓存机制)
避免在onDraw方法里面执行对象的创建
谨慎使用多线程
这些是我在学习中所粗浅的认识,对于ANR和OOM的认识还不够透彻,希望大佬们可以多多指出这些问题中的不足,让我们一起共同进步。
最后
以上就是仁爱乌龟为你收集整理的ANR和OOM的介绍和如何避免这些错误的全部内容,希望文章能够帮你解决ANR和OOM的介绍和如何避免这些错误所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复