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;
}