【问题标题】:Which android context should i use in singletons?我应该在单例中使用哪个 android 上下文?
【发布时间】:2017-11-23 00:48:39
【问题描述】:

当我编写我的单例时,我总是在单例类中提供getInstance(Context) 方法。但是我应该将哪个上下文对象传递给该方法:Activity 上下文(Activity 类中的this)还是Application Context?如果我通过一个或另一个会有什么不同?

为了说明,我有一个数据库管理器,它的 getInstance 方法定义如下:

public static Database getInstance(Context context) {
    if (Database.instance == null)
        instance = new Database(context);
    return instance;
}

构造函数看起来像:

private Database(Context context) { 
    this.sqLiteDatabase = context.openOrCreateDatabase(...);
}

【问题讨论】:

    标签: java android singleton


    【解决方案1】:

    您传入的内容并不重要。你使用应该是Application上下文:

    public static Database getInstance(Context context) {
        if (Database.instance == null)
            instance = new Database(context.getApplicationContext());
        return instance;
    }
    

    现在,如果你想强制调用者提供Application,你可以这样做:

    public static Database getInstance(Application context) {
        if (Database.instance == null)
            instance = new Database(context);
        return instance;
    }
    

    就我个人而言,我喜欢将其视为 API 隐藏的实现细节。

    Application 是一个全局对象,在创建进程时创建。因此,它实际上是“预先泄露的”。你不能进一步泄漏它。从某些单例引用的其他类型的Context(例如Activity)可能会导致内存泄漏。

    请参阅Dave Smith's epic blog post on the roles of different Context objects 了解更多信息。

    【讨论】:

    • 使用context.getApplicationContext() 是使用ApplicationContext 的一个非常好的解决方案。但我需要知道它在应用程序中有什么不同。
    • 嗨@CommonsWare,你能花一点时间看看我的问题吗,我将不胜感激。谢谢你。 stackoverflow.com/q/48161708/1602807
    猜你喜欢
    • 2019-07-03
    • 2012-10-28
    • 2019-10-23
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多