我必须在不同位置以相同的样式显示20个相同的球。但我一直收到错误:java.lang.OutOfMemoryError:位图大小超过VM预算
起初我尝试使用anim文件夹中的xml文件。但我不能释放在xml中声明的任何资源。所以我改为使用BitmapFactory创建Bitmap,并调用recycle函数。但我也无法克服。
代码流是这样的:
Bitmap[] ballBitmap;
int[] playOrder = new int[2]; //the balls will play in order of the definiens in playOrder
ImageView[] balls = new ImageView[20]; //it contains 20 balls
private void iniNewQuestion() {
passNum++;
if(passNum > 1) clearPic();
if(passNum < 20) playBall();
}
private void playBall() {
int ballIndex = playOrder[passNum - 1] - 1;
ballBitmap = new Bitmap[9];
ballBitmap[0] = BitmapFactory.decodeResource(context.getResources(), R.drawable.game_ball_up_01);
ballBitmap[1] = BitmapFactory.decodeResource(context.getResources(), R.drawable.game_ball_up_02);
ballBitmap[2] = BitmapFactory.decodeResource(context.getResources(), R.drawable.game_ball_up_03);
ballBitmap[3] = BitmapFactory.decodeResource(context.getResources(), R.drawable.game_ball_up_04);
ballBitmap[4] = BitmapFactory.decodeResource(context.getResources(), R.drawable.game_ball_up_05);
ballBitmap[5] = BitmapFactory.decodeResource(context.getResources(), R.drawable.game_ball_flat_06);
ballBitmap[6] = BitmapFactory.decodeResource(context.getResources(), R.drawable.game_ball_flat_07);
ballBitmap[7] = BitmapFactory.decodeResource(context.getResources(), R.drawable.game_ball_flat_08);
ballBitmap[8] = BitmapFactory.decodeResource(context.getResources(), R.drawable.game_ball_flat_09);
AnimationDrawable ballAnimation = new AnimationDrawable();
for (int picIndex = 0; picIndex < 9; picIndex++)
{
ballAnimation.addFrame(new BitmapDrawable(ballBitmap[picIndex] ), breakTime[picIndex]);
//if(picIndex > 0) ballBitmap[picIndex].recycle();
}
ballAnimation.setOneShot(true);
balls[ballIndex].setBackgroundDrawable(ballAnimation);
ballAnimation.start();
Handler toNextQuestionHandler = new Handler();
toNextQuestionHandler.postDelayed(runIniNewQuestion, 3000);
}
private Runnable runIniNewQuestion = new Runnable() { public void run() { iniNewQuestion(); } };
private void clearPic() {
int picIndex = 0;
for (picIndex = 0; picIndex < 9; picIndex++)
{
if(ballBitmap[picIndex] != null )
{
if(!ballBitmap[picIndex].isRecycled()) ballBitmap[picIndex].recycle();
}
}
}
当我打第6球时总会发生这种情况。错误日志是:
01-28 05:29:31.927:E / AndroidRuntime(1090):java.lang.OutOfMemoryError:位图大小超过VM预算 01-28 05:29:31.927:E / AndroidRuntime(1090):在android.graphics.Bitmap.nativeCreate(Native Method) 01-28 05:29:31.927:E / AndroidRuntime(1090):在android.graphics.Bitmap.createBitmap(Bitmap.java:468) 01-28 05:29:31.927:E / AndroidRuntime(1090):在android.graphics.Bitmap.createBitmap(Bitmap.java:435) 01-28 05:29:31.927:E / AndroidRuntime(1090):在android.graphics.Bitmap.createScaledBitmap(Bitmap.java:340) 01-28 05:29:31.927:E / AndroidRuntime(1090):在android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:488) 01-28 05:29:31.927:E / AndroidRuntime(1090):在android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:462) 01-28 05:29:31.927:E / AndroidRuntime(1090):在android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:323) 01-28 05:29:31.927:E / AndroidRuntime(1090):在android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:346) 01-28 05:29:31.927:E / AndroidRuntime(1090):在android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:372) 01-28 05:29:31.927:E / AndroidRuntime(1090):at com.gzconcern.animalaba.AbaGame。 playBall (AbaGame.java:533)
我想当我向ballAnimation添加一个帧时,我从图片中获得了一个新的Bitmap,所以我应该立即释放它。但当我打电话给回收时,结果却是这样:
java.lang.RuntimeException:Canvas:尝试使用回收的位图android.graphics.Bitmap@44e85c60
答案 0 :(得分:1)
在运行时使用重型位图时,这是一个常见问题。希望这里给出的一些解决方案对您有用http://code.google.com/p/android/issues/detail?id=8488 您应该做的另一件事是在DDMS中监视应用程序的运行时内存。 要监控它,请选择设备,然后选择您的应用程序。然后选择顶部显示“更新堆”的绿色图标。然后打开“Heap”窗口并选择“Cause GC”。 在那里,您将看到可用于您的应用程序的内存以及您的应用程序消耗的实际内存。