现在的手机像素都比较高,所以拍照后的照片体积都比较大,处理起来会占用比较多的内存,如果处理不当,回收不及时,那么很容易发生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"属性,那么就可以使用,但本质问题并没有解决,只是单纯的增加内存的占用空间。