bitmap OOM问题

现在的手机像素都比较高,所以拍照后的照片体积都比较大,处理起来会占用比较多的内存,如果处理不当,回收不及时,那么很容易发生OOM的问题,之前也写过类似的文章,现在再来写一下。

一般解决大图片OOM的问题,需要注意的几个地方:

因为大图片,比如3~4M,加载到内存中,有编码方式,比如使用ARGB8888编码方式,那么一个像素就需要4字节,如果使用RGB565,则只需要2字节,

一般加载图片到内存bitmap可以使用类似如下的代码:

  //获取图片的高和宽
        BitmapFactory.Options options = new BitmapFactory.Options();
        //这一个设置使 BitmapFactory.decodeFile获得的图片是空的,但是会将图片信息写到options中
        options.inJustDecodeBounds = true;        
        BitmapFactory.decodeFile(src, options); 
        options.inSampleSize =1;
        //设置可以获取数据
        options.inJustDecodeBounds = false;
        options.inPreferredConfig=Config.RGB_565;
        //获取图片
        return BitmapFactory.decodeFile(src, options);  

如果使用RGB565,一般会比ARGB8888少一半空间左右。

对于大图片,如果不是必要,那么一般可以只需要获取到该图片的尺寸,然后进行缩放压缩,获取你需要的图片尺寸即可,这样可以节省很多内存空间。


第二个就是回收,因为bitmap占用空间比较大,如果不及时释放,很容易内存迅速增加,所以,记得不用的时候需要去掉对象对bitmap内存区域的引用,及时释放。

比如imageView使用一张bitmap,

       bitmap =  xxx;//图片获取过程略
        mImageView.setImageBitmap(bitmap);

那么在不使用bitmap的地方,就需要写:

mImageView.setImageBitmap(null);

然后回收刚才开辟的bitmap空间,如下:

if (bitmaps != null) {
					bitmaps.recycle();
					bitmaps = null;
				}

下面可以增加一句:System.gc();  主动通知系统去回收内存,当然这个是异步的。

如果回收的及时,一般OOM是可以防止的

另外就是实在不知道该怎么解决,那么不妨先让应用能运行,然后在想办法优化,那么就需要在配置文件manifest文件的application节点增加

  android:largeHeap="true"属性,那么就可以使用,但本质问题并没有解决,只是单纯的增加内存的占用空间。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值