RT,在android开发中,如果在使用context的地方全部用getApplicationContext()会不会避免某些内存泄漏问题?


好巧,本人Android小小白,刚学到这里,也有些不懂,搜索了好多资料,自己刚好码了一篇关于题主所说的博文,给大家分享一下我的一点点想法吧,若有错误,请大家指出,万分感激!!首先,Activity的Context和Application的Context肯定不是一个东西,一个是当前活动的
Context,它的生命周期仅限于此活动,一个是整个应用程序的Context,它的生命周期伴随著整个程序,鉴于Activity的Context的
特点,滥用它往往会造成内存泄露,如下代码所示:

public class TestContext{
private static TestContext testContext;
private Context context;

private TestContext(Context context){
this.context = context;
}

public static synchronized TestContext getInstance(Context context){
if(null == testContext)
testContext = new TestContext(context);
return testContext;
}
}

显而易见,上述单例模式中textContext是强引用static类型,往往它的生命周期伴随著整个应用程序,但你传
递进来的Context若是一个Activity的,只要我们这个应用程序还活著,它就没有办法正常的回收,这就造成了内存的泄露。解决的方法很简单,将
初始化TestContext是传递的参数context变为context.getApplicationContext()既可,因为用此方法获得的是应用程序的
context,因此就不用担心内存泄露了。既然如此的话,在能使用context的地方全部替换context.getApplicationContext()不就皆大欢喜了吗?很遗憾的来
说,这样不行,因为他们根本不是一个东西,它们的应用场景是不同的,并非所有的Activity的Context的场景,Application的
Context依然可以,一下是我总结出来的一个表格,表示了它俩之间的应用场景:

其实我们只要把握住两条原则即可:

1.凡是和UI相关的,都不建议使用Application的Context.

2..不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity本身生命周期是一样的,若不一样,请考虑一下是否可以使用Application的Context.


开发中的一个原则,谁创建,谁释放,严格遵循,就基本不会发生内存泄露

另外,不可能全部使用applicationContext的

使用context的地方全部用getApplicationContext()的确是可以避免在某些情况Activity被hold住从而导致释放不了的问题,而且像Activity这种内存泄漏也是很难被发现。但是并不能所有的Context都全部使用getApplicationContext(),比如你创建Dialog构造函数传递进去的Context一定要是Activity,否则就会出错;还有就是你需要调用到Activity本身提供的方法等等情况。

所以,可以使用getApplicationContext()就不要使用Activity。同时,也需要在写代码的时候提高对内存泄漏的敏感度,尽量去避免发生内存泄漏!


首先,getApplicationContext确实能在一定程度上减少内存泄露。但是,不可能在需要Context的地方全部使用getApplicationContext。大体的原则是跟UI相关的用Activity,其它用getApplicationContext。
安卓的 Activity设计很怪异,生存周期难以控制,有时候一个 Activity会被创建、销毁多次,同时存在多个Activity实例的情况也有。所以不能依赖Activity管理资源,只能将Activity看做一个视图,本身不维护业务状态。否则就会出现各种难缠的状况。使用getApplicationContext,也是同样的效果,可以使程序尽量不在Activity管理资源和业务状态。所以楼主的提法,靠谱。

Android学习系列(36)--App调试内存泄露之Context篇(上)

见过的讲的比较好的一篇博客

特别是System Service对象 是很容易不小心造成句柄泄露的另外推荐leakcanary工具,能很容易的检测到句柄泄露,相关的资料可自行搜索,网上很多
只要管理的好传什么都无所谓,当然优先使用getApplicationContext。


推荐阅读:
相关文章