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. 我删除了 ;ayout 中的 android:background="@drawable/bg_initial" 但它没有效果。

  2. 该应用程序正在使用具有背景图像的布局的其他视图,并且这些视图没有出现问题。

从表面上看,这似乎不是内存问题,而是在同一视图中设置不同背景时的问题。我可以实现不同的切换背景图像,但这似乎有点过头了。如果有人提供一个简单而真实的解决方案,我会很高兴。

编辑 :

我在 OnDestroy() 中添加了背景位图垃圾收集代码,这似乎解决了问题.. 至少我现在无法重新创建问题。

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

4

1 回答 1

0

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

尝试以下操作:

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

请参阅我的答案以解决 OOME,它可能会对您有所帮助。位图大小超出Vm预算错误android

于 2013-02-05T14:08:27.733 回答