2

我有这个功能,可以从 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);

谢谢!

4

2 回答 2

2

当您不正确使用位图时,内存不足错误并不少见。

位图占用大量内存,尤其是对于照片等丰富的图像。例如,Galaxy Nexus 上的相机可拍摄高达 2592x1936 像素(5 兆像素)的照片。如果使用的位图配置是 ARGB_8888(Android 2.3 以后的默认配置),则将此图像加载到内存中大约需要 19MB 内存(2592*1936*4 字节),立即耗尽某些设备上的每个应用程序的限制。

关于如何有效使用位图有一个很棒的 android 指南 。

按照指南,您应该能够在不损失任何可见质量的情况下显着减少内存消耗,避免不必要的崩溃。

于 2012-08-25T20:56:25.970 回答
1

代码看起来不错。

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

于 2012-08-25T20:42:20.597 回答