參考自
小鰻的 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);