持有应用程序Context实例是一种不好的做法吗?

11

据我所知,Android中的Application是一个单例(如果我错了请指正),我们始终只有一个应用程序上下文实例。

因此,从这个角度来看,在我的Application类中保存应用程序上下文是否是一种不好的做法?它会导致大量的内存泄漏吗?

这里是一个例子:

public class MyApp extends Application {
    private static Context appContext = null; // <-- here is the thing!

    @Override
    public void onCreate() {
        appContext = this;
    }

    public static Context getApplicationContextSingleton () {
        return MyApp.appContext;
    }
}

做这件事的原因是全局访问类(比如PreferencesManager),大多数都需要一个上下文的静态方法。所以,我考虑存储应用程序的上下文,而不是每次传递它(甚至是存储在实例中,可能会有问题)。但我没有看到哪些缺点?

1个回答

12

在我的Application类中保存应用程序Context是一种不好的做法吗?

这是代码异味。

它会导致大规模的内存泄漏吗?

有静态数据成员不会导致大规模的内存泄漏。是否因为您过度使用Application对象而导致大规模的内存泄漏取决于您在何处以及如何使用它。

我没有看到的缺点是什么?

并非所有的Context都是相等的。通常情况下,只有在您知道“特别需要应用程序上下文”的情况下才使用Application,而不是用于所有内容。

DoubleEncore公司的Dave Smith在其博客文章中详细介绍了不同类型的Context及何时使用其中之一。


2
“Code Smell”是什么意思?它闻起来像是不良实践吗? - Bolhoso
2
@Bolhoso:http://en.wikipedia.org/wiki/Code_smell “代码异味”是指程序源代码中可能暗示了更深层次问题的任何症状。代码异味通常不是漏洞——它们在技术上并不是错误的,也不会阻止程序当前的运行。相反,它们表明设计上存在弱点,可能会减缓开发速度或增加未来出现漏洞或故障的风险。” - CommonsWare
1
总是这样做非常糟糕且不专业。永远不要这样做。 - Simon Dorociak
2
@Geralt 我理解你的观点。虽然文章中提到“现在我们的Context来自哪里已经不重要了,因为我们持有的引用是安全的。应用程序上下文本身就是一个单例,所以通过创建另一个静态引用并不会泄漏任何东西。”但在我的情况下,创建一个Singleton PreferencesManager更安全,我可以在getInstance中接收一个context,在那里我可以保存对应用程序上下文的引用。对吗? - Bolhoso
2
@IgorGanapolsky:你绝对不需要将Views作为全局静态变量传递。 - CommonsWare
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接