Android bitmap OutOfMemory 避免措施


Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的机器为24M。因此我们所能利用的内存空间是有限的。如果我们的内存占用超过了一定的水平就会出现OutOfMemory的错误。

曾经一个项目的需求是自定义相机拍照后,对照片进行程序内存内的保存(不进行物理存储,显示并发送给服务器),在一些内存不足的手机上遭遇了bitmap的OOM 问题,下面总结几点经验。


1.尽量使用BitmapFactory.decodeStream,直接调用了JNI>>nativeDecodeAsset()来完成decode无需再使用java层的createBitmap,避免了java层的消耗。

BitmapFactory.decodeResource 是通过Java层来createBitmap来完成图片的加载,增加了java层的内存消耗。


2.尽量不要使用setImageBitmapsetImageResourceBitmapFactory.decodeResource直接使用图片路径来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再调用上述方法将其设为ImageViewsource


3.decodeStream传入 BitmapFactory.Options()参数,默认的格式是ARGB_8888,每个像素占用4byte内存(32位),改用RGB_56516位),两者差别是少了个透明度A,视觉基本无差,占用内存却减少了一半。(这个改进非常必要)


4.对可能会发生内存的代码捕获OutOfMemoryError异常,调用:

System.gc();

System.runFinalization();

提醒系统及时回收,并再次decode。


5.尽量避免在全局变量中保有bitmap对象,若要保存在内存中,将其转为byte[],需要显示的时候再decodedecode的方法遵循1~4的原则。


6.如果要旋转图片,可以使显示图片的view旋转,而不要通过传入旋转角度的参数来createBitmap,一定要慎用createBitmap这个方法!


7.及时回收bitmap对象:

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

b.recycle();

b = null;

}

8.可以通过加载一个缩放之后的图片,来减少创建图片时的内存分配量,但是需要注意图片缩放后可能会损失质量

BitmapFactory.Options options =new BitmapFactory.Options();

options.inSampleSize = 2;

Bitmap bitmap = BitmapFactory.decodeStream(stream,null, options);

可以参考: http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html要动态设置图片的inSampleSize,需要先得到图片的尺寸。

BitmapFactory.Options options =new BitmapFactory.Options();

options.inJustDecodeBounds = true;

bitmap = BitmapFactory.decodeStream(stream,null, options);

int imageHeight = options.outHeight;

int imageWidth = options.outWidth;

options.inJustDecodeBounds = false;

// recreate the stream

// make some calculation to define inSampleSize

options.inSampleSize = ?;

Bitmap bitmap = BitmapFactory.decodeStream(stream,null, options);

(这条是参照http://outofmemory.cn/java/OutOfMemoryError/Android-BitmapFactory.decodeStream-method-OutOfMemoryError-solution,但由于我曾经负责的这块的机能要求原图,就没用到这个方法。)

9.如果是很多图片,要考虑缓存的问题。


基本注意以上几点就可以避免bitmapOOM发生,曾经程序的这块机能在30多部手机上测试有将近10台在不同时点发生了OOM,按以上策略实施后全部通过了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值