【转】【Android】Gridview出现java.lang.OutOfMemoryError: bitmap size exceeds VM budget解决方法
今天在做一个简单的文件夹浏览器时,用GridView加载图片文件时出现这个问题。
在网上查了下原因:
当图片过大,或数量较多时使用BitmapFactory解码图片会出java.lang.OutOfMemoryError: bitmap size exceeds VM budget
android系统中读取位图Bitmap时.分给虚拟机中图片的堆栈大小只有8M。所以不管是如何调用的图片,太多太大虚拟机肯定会报那个错误。
网上也给出了答案,具体有如下几种方法:
1.使用缩略图,缩小图片大小
这里可以按比例缩小图片:
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 4;
Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts); //即是按1/4的比例缩小图片。(这里表述有误,意思指宽和高都是原来的1/4)
进一步的,
如何设置恰当的inSampleSize是解决该问题的关键之一。BitmapFactory.Options提供了另一个成员inJustDecodeBounds。
设置inJustDecodeBounds为true后,decodeFile并不分配空间,但可计算出原始图片的长度和宽度,即opts.width和opts.height。有了这两个参数,再通过一定的算法,即可得到一个恰当的inSampleSize。
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inJustDecodeBounds = true;
BitmapFactory.decodeFile(paths.get(position), opts);
opts.inSampleSize = Math.max((int)(opts.outHeight / (float) (欲显示的高度)), (int)(opts.outWidth / (float)(欲显示的宽度));
opts.inJustDecodeBounds = false;
Bitmap bm = BitmapFactory.decodeFile(paths.get(position), opts);
setImageBitmap(bm);
我采用这一种解决了问题,但猜想如果图片更多的话,可能一样会出现内存不够的问题
2.增加VM大小
VMRuntime.getRuntime().setMinimumHeapSize(16 * 1024 * 1024);
VMRuntime.getRuntime().setTargetHeapUtilization(0.75f);
3.回收Bitmap资源
合理利用Bitmap.Recycle()来释放Bitmap资源。在网上查了下方法,未找到何时去调用这个函数来回收资源,想到的可能只有在进入下一层目录时,就回收当前的这一层目录的资源。
转自:http://doublekj.blog.163.com/blog/static/1468184742012710115238283/

浙公网安备 33010602011771号