createBitmap()引导我进入java.lang.OutOfMemoryError

时间:2012-03-27 08:14:47

标签: android bitmap system out-of-memory

我尝试每隔10-100ms旋转3个imageViews(或者更好的是它们后面的位图)。 我做这样的轮换:

ImageView ivLoad;
Bitmap bMapLoad;

....

Matrix mat=new Matrix();
mat.reset();
mat.postScale(1.55f, 1.55f);
mat.postRotate((float)currentLoadDegree+(float)LoadDegree);
bMapLoad = Bitmap.createBitmap(bMapLoadgr, 0, 0, bMapLoadgr.getWidth(), bMapLoadgr.getHeight(), mat, true);
ivLoad.setImageBitmap(bMapLoad);
ivLoad.setScaleType(ScaleType.CENTER);

....

我第一次启动应用程序everthing工作正常。 第二次也有效 但第三次启动应用程序时崩溃时出现以下错误:

03-27 10:01:09.234: E/AndroidRuntime(3603): java.lang.OutOfMemoryError
03-27 10:01:09.234: E/AndroidRuntime(3603):     at android.graphics.Bitmap.nativeCreate(Native Method)    
03-27 10:01:09.234: E/AndroidRuntime(3603):     at android.graphics.Bitmap.createBitmap(Bitmap.java:605)  
03-27 10:01:09.234: E/AndroidRuntime(3603):     at android.graphics.Bitmap.createBitmap(Bitmap.java:551)
经过很长一段时间的努力,我发现当我在onDestroy中调用System.exit(0)方法时,我会发现。 现在我不知道是否会有更好的方法,因为在google上很多人都认为System.exit(0)不安全。

所以我会遇到这个问题吗?

3 个答案:

答案 0 :(得分:2)

您可以旋转正在绘制的画布,而不是旋转位图。

canvas.save();
canvas.translate(-canvasWidth/2, -canvasHeight/2);
canvas.rotate(degrees)

canvas.drawBitmap( ... )

canvas.translate(-canvasWidth/2, -canvasHeight/2);
canvas.restore();

现在,只有在图像本身更新时才会获得新的位图,即使您可以根据需要随时旋转它。但是如果你得到一个新的Bitmap,你仍然需要在旧的Bitmap上调用Bitmap.recycle()

答案 1 :(得分:1)

您不应该在旋转的每一步重新创建位图,而应该尝试将其旋转。这也可以通过Matrix(你已经使用过的)来避免过多的内存使用。

Android: How to rotate a bitmap on a center point

答案 2 :(得分:0)

您获得OutOfMemoryError,因为每次轮播Bitmap时都会加载ImageView。您应该考虑重用已经加载的位图。当您不再需要位图时,也请调用Bitmap.recycle()方法。