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