我有一个实用程序方法(下面)调整位图大小并给我一个新版本。因为我正在使用相当多的图像&我想减少内存不足的可能性,我在使用后已经回收了位图。
这几乎适用于所有设备。但是,我已经注意到三星Galaxy tab 3(10英寸)和注释10.1(2014)我得到了下面的堆栈痕迹:
java.lang.IllegalArgumentException: Cannot draw recycled bitmaps
at android.view.GLES20Canvas.drawBitmap(GLES20Canvas.java:756)
at android.view.GLES20RecordingCanvas.drawBitmap(GLES20RecordingCanvas.java:104)
以下是我的调整代码:
private static Bitmap resizeBitmap(int newWidth, int newHeight, Bitmap bitmapResize) {
if (bitmapResize == null) {
return null;
}
int width = bitmapResize.getWidth();
int height = bitmapResize.getHeight();
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmapResize,
newWidth, newHeight, true);
//SHOULD I DO THIS???
bitmapResize.recycle();
return resizedBitmap;
}
我还没弄清楚为什么几乎所有设备都可以工作,除了那些2(可能还有更多)。模拟器也没有显示任何问题。
值得注意的是,并非所有图片都能给我一个"无法绘制回收的位图"错误。只有一些。但它始终如一的图像。
(如果使用它,我的应用程序在2.2以上运行)
答案 0 :(得分:2)
我设法找到解决问题的方法。事实证明,如果调整大小的宽度/高度与原始图像匹配,原始图像可以作为优化传回。
我想在某些设备上,我的计算导致我尝试将图像调整为现有大小。当我回收'#34; old"位图,我也重新调整了调整大小的位置。
解决方案是将我的代码更改为
if (bitmapResize!=resizedBitmap )
bitmapResize.recycle();
我发现此问题涉及我的问题(我在初次搜索问题时没有找到)
https://groups.google.com/forum/#!topic/android-developers/M6njPbo3U0c
答案 1 :(得分:0)
我在ma游戏中遇到了类似的问题,根据我的经验,你做的是正确的事情。它是回收旧位图的正确位置,并且会阻止OutOfMemoryExceptions,请记住,这个Bitmap实例将不再可用。
答案 2 :(得分:0)
您可以简单地使用输入位图参考作为输出。这样您的输入位图将被覆盖,您无需回收它。
种类:
private static Bitmap resizeBitmap(int newWidth, int newHeight, Bitmap bitmapResize) {
if (bitmapResize == null) {
return null;
}
int width = bitmapResize.getWidth();
int height = bitmapResize.getHeight();
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
return Bitmap.createScaledBitmap(bitmapResize,
newWidth, newHeight, true);
}