Android系统会对bitmap内存空间有限制,一般上限为8M,因此在我们进行图片处理操作时,经常会遇到超过上限抛出异常:
java.lang.OutOfMemoryError:bitmap size exceeds VM budget
这是 Bitmap bm = BitmapFactory.decodeFile(path)引起的,Path是sd卡中图片的路径,如果图片过大就会产生错误;
常用的解决方案有:
一、我们可以通过修改采样避免这个问题:
BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize = 10;
Bitmap bmp=BitmapFactory.decodeFile(path,options);
修改采样可以避免这个问题,但是这个inSampleSize该如何确定?1000*1000的图片缩小10倍,可以避免内存溢出;但是本身很小的图片也缩小10倍,并不是我想要的结果。。。。。怎么做可以兼顾?
二、异常捕获,避免程序崩溃
try{
Bitmap bmp=BitmapFactory.decodeFile(path,options);
}catch (OutOfMemoryError e) {
// 提示系统,进行内存回收
System.gc();
//清除程序缓存
clearCache();
//压缩图片重新加载
reload();
}
介绍一下图片占用进程的内存算法吧。
android中处理图片的基础类是Bitmap,顾名思义,就是位图。占用内存的算法如下:
图片的width*height*Config。
如果Config设置为ARGB_8888,那么上面的Config就是4。一张480*320的图片占用的内存就是480*320*4 byte。
前面有人说了一下8M的概念,其实是在默认情况下android进程的内存占用量为16M,因为Bitmap他除了java中持有数据外,底层C++的 skia图形库还会持有一个SKBitmap对象,因此一般图片占用内存推荐大小应该不超过8M。这个可以调整,编译源代码时可以设置参数。