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;
    }
发布了216 篇原创文章 · 获赞 91 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/yu75567218/article/details/102383859