如何释放/释放/销毁AnimationDrawable因为我遇到了Out Of Memory问题?

时间:2013-11-17 20:02:48

标签: android android-animation animationdrawable

我在我的所有五个活动中都使用了AnimationDrawable。经过一段时间后,我出现了错误。

问题与Virtual Heap Memory有关,我找到了一种方法,当我点击新的Activity时,删除所有早期/前一个动画。

我尝试了一些方法:

 1) Runtime.getRuntime().gc();

 2) activity_name.finish();

 3) startGirlBlinking.stop();
    iView_cow.setBackgroundDrawable(null);

Logcat:

E/AndroidRuntime(11449): java.lang.OutOfMemoryError
E/AndroidRuntime(11449):    at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
E/AndroidRuntime(11449):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:577)
E/AndroidRuntime(11449):    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:445)

帮助重新启动应用程序崩溃,但不是很长时间。我需要一个有价值的解决方案。

如何恢复这件事。 Plase给了我这样做的方法。

4 个答案:

答案 0 :(得分:4)

使用以下方法扩展您的AnimationDrawable:

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

答案 1 :(得分:0)

你可以尝试这样:

((AnimationDrawable)(someButton.getBackground())).stop();
someButton.setBackgroundDrawable(null);
someButton.setBackgroundResource(R.drawable.animation);

答案 2 :(得分:0)

我认为问题是你解码的资源太大了。您应该使用public static Bitmap decodeResourceStream (Resources res, TypedValue value, InputStream is, Rect pad, BitmapFactory.Options opts)缩小资源。

答案 3 :(得分:0)

看起来位图对于您正在运行它的设备来说太大了。我建议做以下事情:

  1. 请阅读此处有关处理位图的良好实践的文档 - 特别是有效加载大位图并管理位图内存 - http://developer.android.com/training/displaying-bitmaps/index.html
  2. 使用图形程序缩小位图并将其放在相应的文件夹中 - xhdpi / hdpi / mdpi等
  3. 在解码位图时查看更改Bitmap.Config(options.inPreferredConfig)值 - http://developer.android.com/reference/android/graphics/Bitmap.Config.html