回收的位图exception

我得到这个例外:

exception:java.lang.IllegalStateException:不能复制一个循环的位图

我的代码是:

int width = bitmap.getWidth(); int height = bitmap.getHeight(); int newWidth; int newHeight; if (width >= height) { newWidth = Math.min(width,1024); newHeight = (int) (((float)newWidth)*height/width); } else { newHeight = Math.min(height, 1024); newWidth = (int) (((float)newHeight)*width/height); } float scaleWidth = ((float)newWidth)/width; float scaleHeight = ((float)newHeight)/height; Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); switch (orientation) { case 3: matrix.postRotate(180); break; case 6: matrix.postRotate(90); break; case 8: matrix.postRotate(270); break; } Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); bitmap.recycle(); try { bitmap = resizedBitmap.copy(resizedBitmap.getConfig(), true); } catch (Exception e) { Log.v(TAG,"Exception: "+e); } 

如果例外告诉我,我已经回收resizedBitmap ,这是明显错误的! 我究竟做错了什么??

Solutions Collecting From Web of "回收的位图exception"

你实际上是调用bitmap.recycle(); 在这一行之后:

 Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true); 

引用Bitmap.createBitmap()方法的Javadoc:

从可选matrix转换的源位图的子集中返回不可变的位图。 新的位图可能与源相同,也可能是复制的。 它被初始化为与原始位图相同的密度。 如果源位图是不可变的,并且所请求的子集与源位图本身相同,则返回源位图,并且不创build新的位图。

这意味着在某些情况下,即要求将源位图调整为其实际大小时,源位图和resize的位图之间不会有区别。 为了节省内存,该方法将只返回相同的位图实例

要修复你的代码,你应该检查是否已经创build了一个新的位图:

 Bitmap resizedBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0, width, height, matrix, true); if (resizedBitmap != sourceBitmap) { sourceBitmap.recycle(); }