在项目过程中,我们存在很多工具类,这些工具类不限于网络请求及一些工具方法,这些工具方法大多数是需要访问资源的,这时就需要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
网友评论