Android OOM异常的快捷常规处理方法

整理一下平时自己对于Android OOM异常的常规处理方法:


什么是OOM?

OutOfMemory(内存溢出):不良代码创建了【太大或太多的对象实例】,且用完没有及时释放,导致运行内存超过了系统分配的上限(爆内存),从而使应用异常退出的现象

然后解决方法有很多,根据需求和应用场景不同,处理方法也各有不同


目录:

-1、及时释放Bitmap资源

-2、加载Bitmap时Options的设置

-3、使用decodeStream代替decodeResource

-4、使用软引用持有资源

-5、三级缓存策略


第一种:及时释放Bitmap资源

/**

* 释放Bitmap资源

*/

public voidrecycleBitmap() {

Bitmap bitmap = BitmapFactory.decodeFile(PATH_NAME);

if(bitmap !=null&& !bitmap.isRecycled()) {

bitmap.recycle();

bitmap =null;

}

System.gc();

}

需要注意的是:

bitmap本身调用recycle()也是相当于通过呼叫垃圾回收器来回收资源,并不是立刻释放资源的。

而且在Android2.3以及更低的版本中,Bitmap的引用是放在堆中的,而Bitmap的数据部分是放在栈中的,需要用户调用recycle方法手动进行内存回收

而在Android2.3之后,整个Bitmap,包括数据和引用,都放在了堆中,这样,整个Bitmap的回收就全部交给GC了,这个recycle方法就再也不需要使用了。

对于Bitmap.recycle的更加详细的说法可以去看下面这个连接:

http://hukai.me/android-training-course-in-chinese/graphics/displaying-bitmaps/manage-memory.html


第二种:创建Bitmap时,Options的设置:

1、颜色模式设置:inPreferredConfig

·ALPHA_8——只有透明度通道,占用一个字节8位,有256个不同透明度梯度 ,连图片都看不见了。。。。

·ARGB_4444——有透明度和红绿蓝四个通道,每像素占用2字节16位,每个通道占用4位,即16种不同梯度,显示效果较差

·ARGB_8888——有透明度和红绿蓝四个通道,每像素占用4字节32位,每个通道占用8位,即256种不同梯度,显示效果好,是安卓默认的颜色模式

·RGB_565——有红绿蓝三个通道,每像素占用2字节16位,红绿蓝分别占5、6、6位,即32种不同梯度,但是不具备透明通道,是一种常用的效果和开销都比较折中的颜色模式

2、采样率inSampleSize

-图片上的像素越多,显示图片的内存开销也就越高

-设置采样率,就可以让图片均匀地丢掉图片的一些像素,既能完整显示图片,又能降低图片的开销

-采样率的设置只能是:2的整数幂,2,4,8..... ,当设置为4的时候,只均匀采集原有1/4的像素

-所以,通常设置采样率来进行二次采样来降低图片的内存开销会是有效地做法

3、解码大小inJustDecodeBounds

-很多时候我们都不需要图片的完整显示,仅仅需要他的部分属性的时候,我们就可以将这个属性设置为true

-这个时候图片就不会去加载图片的位图信息,只会返回图片宽高信息并放进Options里面的供我们使用。

-可以通过options.outHeight和options.outWidth来使用

-搭配inSampleSize来使用:

首先用inJustDecodeBounds来确定图片的大小,然后使用inJustDecodeBounds来设置应该压缩的宽高,从而达到内存优化

代码如图:


Options设置

第三种:

使用BitmapFactory.decodeStream:

-通常我们在加载本地图片资源的时候会使用decodeResource()方法

-但是我们在追溯源码的时候发现了这样一个关系

-decodeResource() --> decodeResourceStream() --> decodeStream() --> native

-然后我们可以看到decodeResourceStream()源码如下:


decodeResourceStream源码

-由此,我们发现了

-decodeResource在解析时会对Bitmap根据当前设备屏幕像素密度densityDpi的值进行缩放适配操作

- 使得解析出来的Bitmap与当前设备的分辨率匹配,达到一个最佳的显示效果,并且Bitmap的大小将比原始的大

更加详细的描述可以参考:

http://www.androidchina.net/4532.html?utm_source=tuicool&utm_medium=referral

- 所以得出的结论是:

-尽量多的使用decodeStream来加载图片资源

-使用如下:


decodeStream使用

第四种:

使用软引用持有资源:

普通的Bitmap对象都是强引用对象,正在使用时难以释放资源造成OOM

所以使用软引用来代替强引用,以达到在内存不足的情况下会强制释放部分资源,以保持程序的正常运行

具体的代码如下:


软引用


第五种:

三级缓存策略:

-很多时候我们需要从网上去加载图片资源

-为了防止过多的访问网络资源,而导致流量使用过大,而采取的一种图片资源加载策略

--策略如图:


三级缓存策略

--代码实现如图:


三级缓存策略实现



PS:网络加载图片和文件写入图片不是本篇的重点,我就直接使用以前封装好的工具类了



最后:

-这里的代码我只是做了一个基本的使用演示

-加以完善封装的话就可以形成一个你自己的图片压缩处理的工具类了

-这些只是我在之前学习和工作中总结的一些常规使用技巧

-如果有写的不好,或者理解错误的地方,希望大家可以指出来


补充:

我的Github : https://github.com/Rayhahah/BitmapOOM.git

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容