2013-02-05 31 views
0

我需要根据某些事件为布局设置不同的背景。这导致OOM异常。我添加了代码来解决这个问题,但现在这造成了再循环位图问题。获取画布:在设置布局背景时使用回收的位图

下面是代码:

 if (change_bg != 0) { 
      //Garbage collect the current BG. 
      BitmapDrawable bg = ((BitmapDrawable)llayout.getBackground()); 
      llayout.setBackgroundResource(0); 
      if (bg != null) { 
       bg.getBitmap().recycle(); 
       bg = null; 
      } 
      System.gc(); 

      llayout.setBackgroundResource(change_bg); 
      llayout.invalidate(); 
     } 

这不会发生的第一时间,但一些随机事件4-5之后。

如果我不打电话bg.getBitmap().recycle,会遇到OOM异常。

任何人都可以指出错误或建议在同一视图中设置布局背景 的正确方法吗?

注:

  1. 我删除了android:背景= “@绘制/ bg_initial” 的; ayout,但它没有任何效果。

  2. 该应用程序正在使用其他视图与布局具有背景图像和问题 没有看到这些意见。

从表面上看这似乎并没有被记忆的问题,但问题设置在同一视图不同 时的背景。我可以实现不同的切换背景图片 ,但这似乎矫枉过正。如果有人提供简单而真实的解决方案,会很高兴。

编辑:

我添加了背景位图的垃圾收集的OnDestroy()的代码,并且似乎有 解决这个问题..至少我现在无法立即重现问题。

但我想知道这是什么解释。我没有将布局图或 图像保存在一个静态变量中,因此我不确定它是否保存在内存中。我想知道 是怎么回事。有人可以解释这个吗?

回答

0

这可能是因为imageView指的是图像,并且在设置新的背景图像之前,您正在回收之前的图像(仍由imageView引用),因此会抛出异常。

尝试以下操作:

  1. 通过BitmapDrawable bg = ((BitmapDrawable)llayout.getBackground());
  2. 现在设置新的背景获取先前的背景
  3. 垃圾收集前面的背景。

请看我的答案解决OOME,它可能会帮助你。 bitmap size exceeds Vm budget error android

+0

如果您仔细阅读代码,您的建议已经完成。 llayout.setBackgroundResource(0)。并且在第二次调用setBackground时引发循环位图异常。我没有使用ImageView,而是设置线性布局背景。 – Mano