【问题标题】:Is it a bad practice to hold application Context instance?持有应用程序上下文实例是一种不好的做法吗?
【发布时间】:2013-11-30 15:30:28
【问题描述】:

据我了解,Android 中的应用程序是一个单例(如果我错了,请纠正我),我们总是只有一个应用程序上下文实例。

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

这是一个例子:

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,大多数具有静态方法的类总是需要上下文。因此,我没有每次都传递它(甚至将其存储在一个实例中,这可能很糟糕),而是考虑存储应用程序上下文。我没有看到哪些缺点?

【问题讨论】:

    标签: android design-patterns android-context


    【解决方案1】:

    将应用程序上下文保存在我的应用程序类中是一种不好的做法吗?

    这是一种代码味道。

    会导致大量内存泄漏吗?

    拥有静态数据成员不会导致大量内存泄漏。您对Application 对象的过度使用是否会导致大量内存泄漏取决于您使用它的位置和方式。

    我没有看到哪些缺点?

    并非所有Contexts 都是平等的。一般来说,只有在您知道具体为什么需要Application 上下文时才使用Application,而不是全部使用。

    DoubleEncore 的 Dave Smith 有一个 awesome blog post,涵盖了 Context 类型之间的差异以及何时使用它们。

    【讨论】:

    • “代码气味”是什么意思?闻起来像是不好的做法?
    • @Bolhoso: en.wikipedia.org/wiki/Code_smell “在计算机编程中,代码异味是程序源代码中可能表明存在更深层次问题的任何症状。代码异味通常不是错误——它们在技术上并非不正确并且目前不会阻止程序运行。相反,它们表明设计中的弱点可能会减慢开发速度或增加未来出现错误或失败的风险。”
    • 总是非常糟糕和“猪”的方法。永远不要那样做。
    • @Geralt 我明白你的意思。尽管文章指出“现在我们的 Context 来自哪里并不重要,因为我们持有的引用是安全的。应用程序上下文本身就是一个单例,所以我们不会通过创建另一个静态引用来泄漏任何东西。” ,在我的情况下,创建一个我在 getInstance 中接收上下文的 Singleton PreferencesManager 会更安全,在那里我可以保存对应用程序上下文的引用。对吗?
    • @IgorGanapolsky:您绝对不需要“将视图作为全局静态变量传递”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2012-04-01
    相关资源
    最近更新 更多