我有这个函数从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);
谢谢!
答案 0 :(得分:2)
当你没有正确使用位图时,内存错误并不少见。
Bitmaps会占用大量内存,尤其是对于像照片这样的丰富图像。例如,Galaxy Nexus上的相机拍摄的照片最高可达2592x1936像素(5百万像素)。如果使用的位图配置是ARGB_8888(默认情况下从Android 2.3开始),那么将此图像加载到内存中需要大约19MB的内存(2592 * 1936 * 4字节),立即耗尽某些设备上的每个应用程序限制。
有一个很棒的android指南 how to use Bitmaps efficiently.
按照指南,您应该能够显着降低内存消耗,同时避免任何可见的质量,避免不必要的崩溃。
答案 1 :(得分:1)
代码似乎很好。
但是,此异常还取决于位图的大小(分辨率和位图格式)以及其他消耗内存的对象。