关于Context造成的内存泄漏

2020-10-13  本文已影响0人  crush_d872

在项目过程中,我们存在很多工具类,这些工具类不限于网络请求及一些工具方法,这些工具方法大多数是需要访问资源的,这时就需要Context的参与

在这种情况下,就需要注意Context的引用问题,

1.单例引起的内存泄漏

public class PreDownloadHelper {
   private static PreDownloadHelper mInstance;
   private Context mContext;
   private PreDownloadHelper(final Context context) {          
  //直接引用会造成OOM,单例得生命周期与应用的周期一致
    //使用弱引用 或getApplicationContext
    this.mContext = context;
  }
    public static PreDownloadHelper getInstance(Context context) {
    if(mInstance == null) {
        synchronized (PreDownloadHelper.class) {
            if(mInstance == null) {
                mInstance = new PreDownloadHelper(context);
            }
        }
    }
    return mInstance;
}
}

2.较为隐晦的方式
即在一个类中 声明了一个View如下

private View infoLayout;

而在代码中又进行这样的操作

this.infoLayout = view;

而你这个类又使用了单例,
我们都知道 使用单例必须要把类声明为静态变量:即

public static volatile UserVideoInfoUtil mInstance;

这种情况下 依然会造成内存泄漏

这么写是没有问题的,问题在于,这个Context哪来的我们不能确定,很大的可能性,你在某个Activity里面为了方便,直接传了个this;这样问题就来了,我们的这个类中的sInstance是一个static且强引用的,在其内部引用了一个Activity作为Context,也就是说,我们的这个Activity只要我们的项目活着,就没有办法进行内存回收。而我们的Activity的生命周期肯定没这么长,所以造成了内存泄漏。

我们可以使用软引用,但是如果被回收,就会造成空指针

如果使用context.getApplicationContext()

可以解决问题,但是Activity和Application 的Context应用场景是不一样的


image.png

3.Toast引起的内存泄漏
可参考本文

https://blog.csdn.net/Deaht_Huimie/article/details/104434510

上一篇 下一篇

猜你喜欢

热点阅读