如何回收位图? - 位图大小超过VM预算

时间:2012-08-25 20:33:52

标签: android

我有这个函数从SD加载一个大位图并旋转它。

然而,在第二次或第三次轮换之后,我得到位图大小超过VM预算错误。

任何想法为什么?我回收旧的位图,不是吗?

public void next(String s, int d)
{

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

deg = deg + d;
mBitmap = BitmapFactory.decodeFile(s);

Matrix matrix = new Matrix();
matrix.postRotate(deg);
mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth() , mBitmap.getHeight(), matrix, true);

谢谢!

2 个答案:

答案 0 :(得分:2)

当你没有正确使用位图时,内存错误并不少见。

  

Bitmaps会占用大量内存,尤其是对于像照片这样的丰富图像。例如,Galaxy Nexus上的相机拍摄的照片最高可达2592x1936像素(5百万像素)。如果使用的位图配置是ARGB_8888(默认情况下从Android 2.3开始),那么将此图像加载到内存中需要大约19MB的内存(2592 * 1936 * 4字节),立即耗尽某些设备上的每个应用程序限制。

有一个很棒的android指南 how to use Bitmaps efficiently.

按照指南,您应该能够显着降低内存消耗,同时避免任何可见的质量,避免不必要的崩溃。

答案 1 :(得分:1)

代码似乎很好。

但是,此异常还取决于位图的大小(分辨率和位图格式)以及其他消耗内存的对象。