2013年7月23日 星期二

[Android] 使用 Drawable 時發生 Memory Leak 問題

參考自小鰻的 Android 學習筆記

開發過程中使用到 setBackgroundDrawable 函式來設定 Activity 的背景,從初期到現在偶發性會出現 memory leak 的問題。初期解法僅嘗試降低圖像的解析度,雖然立即有改善記憶體不足的問題,但卻不是治本的方法,以下筆記解決的根本之道。

使用 Drawable 發生 memory leak 的兩種情況:

1、Activity 載入時立即 exception。
解法:降低圖像解析度。

2、Activity 切換過程 (包括螢幕轉向) 發生 exception。
解法:在有呼叫 setBackgroundDrawable 的 Activity 覆寫 onDestroy(),將 Drawable 的 callback 設為 null。

原因在文初的連結說明得很詳細,主要就是呼叫 setBackgroundDrawable 時,程序內部將會偷偷建立 callback 連結至物件內容,因為有 callback 關係,導致此 Activity 在系統 memory 不足時無法被回收。

以下為程式節錄。

RelativeLayout background;

@Override
protected void onCreate(Bundle savedInstanceState) {
    background = (RelativeLayout)findViewById(R.id.layout_begin);
    background.setBackgroundDrawable(getResources().getDrawable(R.drawable.begin_16x9));
}

@Override
public void onDestroy() {
    background.setBackgroundDrawable(null);
    super.onDestroy();
}


另外也可以使用 getNativeHeapSize() 來即時監控目前的 heap memory 使用情況。
Log.i(TAG, "userdMemory: " + Debug.getNativeHeapSize() / 1048576);

0 意見:

張貼留言