【问题标题】:how to relase /free / destroy AnimationDrawable because I got OutOfMemory issue?由于出现内存不足问题,如何释放 /free / destroy AnimationDrawable?
【发布时间】:2013-11-17 20:02:48
【问题描述】:

我在所有五个活动中都使用 AnimationDrawable。一段时间后,我遇到了内存不足错误。

问题与虚拟堆内存有关,当我点击新 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)

得到帮助以解决应用程序崩溃问题,但时间不长。我需要一个有价值的解决方案。

如何解决这个问题。请给我方法。

【问题讨论】:

  • 能否请您发布崩溃的logcat?另外,你也在使用位图吗?
  • 您能否发布内存不足异常的堆栈跟踪以及您认为导致问题的代码。强制垃圾回收通常不是一个好主意。
  • Logcat 与超出堆内存有关 .... 内存不足 .... 我正在从 xml 中为动画列表挑选图像
  • @BenPearson :我使用 Logcat 编辑代码。请看一下
  • @fasteque :我用 logcat 编辑问题,我正在使用 animation_list 使用 xmlfile 中的图像。

标签: android android-animation animationdrawable


【解决方案1】:

用这个扩展你的 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);
    }

【讨论】:

    【解决方案2】:

    你可以试试这样吗:

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

    【讨论】:

    • 但我无法释放所有不可用的内存......一段时间后崩溃肯定会发生
    【解决方案3】:

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

    【讨论】:

    • 是的,如果图像尺寸太大,你是对的,但他需要在更改 Activity 时释放应用程序使用的内存。
    • 根据崩溃日志,是解码问题。如果他能控制位图大小,即使切换到新的Activity,内存也不会耗尽。当然,为了节省资源,一个良好的习惯非常重要,即在 Activity 暂停时释放大量资源。
    【解决方案4】:

    看起来位图对于您运行它的设备来说太大了。我建议执行以下操作:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多