Context的Singleton包装器

时间:2010-05-03 18:00:45

标签: android

我正在考虑为Context创建一个单独的包装器,这样我的模型对象可以在必要时打开并从数据库连接中读取。我的模型对象无法访问Context,我希望避免将对象的Context引用传递给对象。

我打算在此单例中添加对Context返回的Application.getApplicationContext()的引用。这个单例对象将在我的自定义Application实例中初始化,然后才需要或有机会使用它。

任何人都可以想到这样做的原因吗?

3 个答案:

答案 0 :(得分:2)

我建议您考虑一下将应用程序上下文的引用传递给模型对象的原因。

使用单身人士有各种明显的缺点。我不会在这里详细介绍,但您可能需要考虑:

  • 单身人士如何限制您对申请进行适当单元测试的能力。
  • 单身人士隐藏代码中不同实体之间的依赖关系 - 您无法通过检查接口来确定依赖关系。
  • 您无法真正控制单例的生命周期,它可能在您的应用程序的生命周期中存在。您真的希望在应用的生命周期内保留数据库连接吗?
  • 你的单身人士的线程安全。

如果您没有将对上下文的引用传递给应用程序的其他部分的正当理由,那么您可能应该考虑其他一些模式 - 工厂可能是一种可能的解决方案,另一种是另一种服务。

答案 1 :(得分:0)

我不确定我是否接受了你的想法,但这是为我工作的:

public class MyApp extends Application {

private static MyApp instance;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
        // ...
    }

    public static MyApp getInstance(){
        return instance;
    }

    // misc helper methods
}

答案 2 :(得分:0)

粘贴此处以保留格式。

public class ContextContainer
{
    private static boolean initialized;
    private static Context context;

    private ContextContainer()
    {
        //
    }

    public static synchronized void setApplicationContext(Context context)
    {
        if (!initialized) {
            ContextContainer.context = context;
            initialized = true;
        } else {
            throw new RuntimeException("ApplicationContext has already been set!");
        }
    }

    public static synchronized Context getApplicationContext()
    {
        return context;
    }
}