如何在android中解决OutOfMemoryError?

时间:2012-03-06 10:04:16

标签: android android-animation

我已经准备好了可绘制的动画。当应用程序启动时,第一个动画将是start.i有两个按钮(下一个和上一个)具有相同的活动。当我点击下一个按钮时我得到例外,

 java.lang.OutOfMemoryError: bitmap size exceeds VM budget

我的代码是,

从drawable获取可绘制动画,

private void getAnimationForLetters(int mAnim) {
        // TODO Auto-generated method stub
        String anim = "capital_anim_" + new Integer(mAnim).toString();

        final int resID = getApplicationContext().getResources().getIdentifier(
                anim, "drawable", "my-package-name");
        mImgLetter.clearAnimation();
        mImgLetter.setBackgroundResource(resID);
        mImgLetter.post(new Runnable() {

            public void run() {
                loadingAnimation = (AnimationDrawable) mImgLetter
                        .getBackground();
                loadingAnimation.start();
            }
        });

    }

我的下一个按钮代码是,

case R.id.btnNext_:
 unbindDrawables(findViewById(R.id.imgLetter));
mLetterNum=mLetterNum+1;
getAnimationForLetters(mLetterNum);

我的undind drawable方法代码是,

private void unbindDrawables(View view) {
        if (view.getBackground() != null) {
            view.getBackground().setCallback(null);
        }
        if (view instanceof ViewGroup) {
            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
                unbindDrawables(((ViewGroup) view).getChildAt(i));
            }
            ((ViewGroup) view).removeAllViews();
        }
    }

最后我得到例外java.lang.OutOfMemoryError: bitmap size exceeds VM budget 这里显示异常mImgLetter.setBackgroundResource(resID); 请帮帮我。

我添加了以下代码以清除,

loadingAnimation.stop();
        for (int i = 0; i < loadingAnimation.getNumberOfFrames(); ++i){
            Drawable frame = loadingAnimation.getFrame(i);
            if (frame instanceof BitmapDrawable) {
                ((BitmapDrawable)frame).getBitmap().recycle();
            }
            frame.setCallback(null);
        }
        loadingAnimation.setCallback(null);

它只适用于下一个或上一个。第一次点击下一个动画移动到第二个动画,第二次如果我点击上一个按钮我有例外,

Canvas: trying to use a recycled bitmap android.graphics.Bitmap

请帮帮我。

4 个答案:

答案 0 :(得分:3)

确切地说 - 系统知道何时收集垃圾,所以调用它至少没有帮助。

你必须真正管理你的应用程序内存。 290x330可能看起来不多,但是如果你使用的是每个像素4个字节的完整RGBA,那么你的图像会变成380K。如果你有其中几个,你将会耗尽内存。大多数Android设备都不像PC - 它们的内存相当有限。有些只有16M或24M来运行所有内容,包括操作系统和用户可能同时运行的任何其他应用程序。

您可以尝试使用try / catch

包装例程来加载资源
 While( ! success ) {
   try {
       // load resources
  }  catch (OutOfMemoryError E) { 
       // do something to use less memory and try again
  }
 }

答案 1 :(得分:2)

如果您对分辨率和内存较少的手机使用高分辨率图像,可能会发生这种情况。使用Drawable-hdpi,Drawable-mdpi,Drawable-ldpi文件夹并以合适的分辨率放置图像。

仅供参考。当heapSize太少时,您可能也会在模拟器中看到此错误。尝试使用AVD管理器增加堆大小

此链接可能对您有所帮助 Supporting multiple screen resolutions

答案 2 :(得分:0)

请看下面的链接,已经详细讨论了内存不足。

Android Out of memory issue

对我来说,托马斯的解决方案已经成功。

希望它有所帮助。

答案 3 :(得分:-2)

你可以用它来释放记忆:

system.gc();