2013-02-05 36 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