在单例模式中如何避免传入非Application的Context造成的内存泄漏
2016-09-15 16:51
531 查看
下面我们先来看一个非常常见的单例模式:
接着我们来分析这个非常简单的单例模式:
如果此时传入的是Application的Context,没问题;但是如果传入非Application的context例如:Activity的context,由于此context为单例模式持有,那么它的生命周期就会和程序的生命周期一样长, 就会造成此Activity退出销毁却没有被回收,造成严重的内存泄漏;
那么如何避免 呢:方法很简单,那就是不用Activity的context而直接用Application的context.下面我们来看代码:
很多小伙伴看到这里不禁要吐槽了吧,既然要用Application的context,那为何要费力拔插地传入Activity的context然后再调用Activity的context来获得Application的context呢,而不在Application 中添加一个静态方法,返回 Application 的 context.
对啊,Why not?既然有了这个想法我们就一起来试试吧,见代码:
这样当然没问题,需要注意的是静态方法中不能掉用非静态变量和方法!所以context的初始化方法要放在onCreate()中.不过这都是常识,我也是白嘱咐这么一句!
那么接下来单例模式就简单了,连Context参数都不用传了.见代码:
是不是看着用着都舒服多了?!
That is all.
public class GCSingleTon{ private static GCSingleTon singleTon; private Context context; private GCSingleTon(Context context){ this.context=context; } public static GCSingleTon getSingleTon(Context context){ if (singleTon==null){ singleTon=new GCSingleTon(context); } return singleTon; } }
接着我们来分析这个非常简单的单例模式:
如果此时传入的是Application的Context,没问题;但是如果传入非Application的context例如:Activity的context,由于此context为单例模式持有,那么它的生命周期就会和程序的生命周期一样长, 就会造成此Activity退出销毁却没有被回收,造成严重的内存泄漏;
那么如何避免 呢:方法很简单,那就是不用Activity的context而直接用Application的context.下面我们来看代码:
public class GCSingleTon{ private static GCSingleTon singleTon; private Context context; private GCSingleTon(Context context){ //正确的写法是 this.context=context.getApplicationContext(); } public static GCSingleTon getSingleTon(Context context){ if (singleTon==null){ singleTon=new GCSingleTon(context); } return singleTon; } }
很多小伙伴看到这里不禁要吐槽了吧,既然要用Application的context,那为何要费力拔插地传入Activity的context然后再调用Activity的context来获得Application的context呢,而不在Application 中添加一个静态方法,返回 Application 的 context.
对啊,Why not?既然有了这个想法我们就一起来试试吧,见代码:
public class MyApplication extends Application { static Context context; public static Context getContext() { return context; } @Override public void onCreate() { super.onCreate(); context = getApplicationContext(); } }
这样当然没问题,需要注意的是静态方法中不能掉用非静态变量和方法!所以context的初始化方法要放在onCreate()中.不过这都是常识,我也是白嘱咐这么一句!
那么接下来单例模式就简单了,连Context参数都不用传了.见代码:
private GCSingleTon(){ context=MyApplication.getContext(); } public static GCSingleTon getSingleTon(){ if (singleTon==null){ singleTon=new GCSingleTon(); } return singleTon; }
是不是看着用着都舒服多了?!
That is all.
相关文章推荐
- 如何避免Android内存泄漏——Context
- 如何避免使用Handler造成的内存泄漏
- 如何避免Android内存泄漏——Context
- 如何避免Android内存泄漏之Context
- winXP的系统如何避免他人在不需要密码的情况进入安全模式
- Qt如何尽量避免内存泄漏
- 如何避免Android内存泄漏
- 如何避免在Block里用self造成循环引用
- .NET如何避免内存泄漏
- IE8如何定义浏览器工作模式避免网页显示混乱
- 如何避免在Block里用self造成循环引用
- 如何避免内存泄漏(转载)
- 如何避免Android内存泄漏
- 活用设计模式:如何避免一连串的if else
- 避免android程序开发内存泄漏-context
- 如何开启AHCI模式 开启硬盘AHCI模式避免蓝屏的具体步骤
- winXP的系统如何避免他人在不需要密码的情况进入安全模式
- 如何避免Android内存泄漏
- .如何避免Android内存泄漏
- WPF MVVM模式下如何把事件参数传入Viewmodel层