參考自小鰻的 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 意見:
張貼留言