LeakCanary性能優化及常見的內存泄漏

LeakCanary的使用

不知道爲啥,我沒有在application中初始化,直接引入下面leakcanary就可以了。

debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.0-beta-3'

使用非常的方便,出現內存泄漏的時候,通知欄會出現一隻金絲雀的圖標,點擊一下就可以看到出現的內存泄漏的日誌。
使用參考:性能優化總結2:leakcanary的使用(簡潔易懂)

常見的內存泄漏:

1、Toast封裝的靜態方法

public class ToastUtils {
    public static void show(Context context, String content) {
        Toast toast=Toast.makeText(context, null, Toast.LENGTH_SHORT);
        toast.setText(content);
        toast.show();
    }

}

很多人會這樣封裝一個Toast 的工具類。
爲什麼說可能會造成內存泄露?
如果傳入的context是activity,在Toast消失之前,Toast 持有了當前的 Activity,而此時,用戶點擊了返回鍵,導致 Activity 無法被 GC(Garbage Collection垃圾回收) 回收,這個Activity 就引起了內存泄露。
解決方法?

Toast.makeText(getApplicationContext(),"Hello",Toast.LENGTH_SHORT).show();

getApplicationContext()是整個應用的上下文,不會持有某個 Activity 對象。

2、對於UI控件的持有

封裝一個倒計時功能,需要傳入TextView ,以實現倒計時的顯示。

public class TimeCount extends CountDownTimer {

    private TextView mTextView;
	
	// 省略的無關邏輯代碼

    public TimeCount(long millisInFuture, long countDownInterval, TextView textView) {
        this(millisInFuture, countDownInterval, textView, null, null, null);
    }
    
	// 省略的無關邏輯代碼

}

爲什麼說可能會造成內存泄露?
當activity銷燬時,這裏還持有TextView 引用,導致內存泄漏。
解決方法?
增加一個銷燬的方法,在activity的onDestroy中調用。

    public void destroy() {
        cancel();
        onFinish();
        mTextView = null;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章