如何使用dagger2设置和获取模型类的Singleton对象?

Muh*_*fan 5 design-patterns dagger dagger-2

我有什么选项可以在Android应用程序中创建所有模型类的单个实例?

我在下面添加了一个示例模型类

public class User
{
    private String email;
    private String name;
    public String getEmail()           {  return this.email;    }
    public void setEmail(String email) {  this.email = email;   }
    public String getName()            {  return this.name;    }
    public void setName(String name)   {  this.name = name;   }
}
Run Code Online (Sandbox Code Playgroud)

我希望一旦数据存储在Model Class中,就可以在任何活动,类或片段中检索它.我应该使用单身人士,还是有更好的方法?

dagger2会在这种情况下工作吗?dagger2是创建单身人士的替代方案吗?

谢谢

EJK*_*EJK 3

============ 问题 1 -我有什么选择... ===============

在 Android 中使用单例有很多陷阱。其中最重要的是 Android 管理应用程序的生命周期。因此任何活动都可能随时被破坏。或者,如果内存需要用于其他目的,Android 甚至可能会选择终止您的进程。Android 将恢复您的应用程序/活动,但是如果您什么都不做,状态就会丢失。在进程终止场景中,您拥有一个新的 VM 实例,并且 Singleton 对象中的所有状态都会丢失。当然,如果您仔细编码,您可以确保以正确的状态适当地重新创建它们。这可能很困难并且容易出错。

如果您需要从应用程序中的任何活动中使用这些模型类,您可以采取几种更好的方法:

选项1。

我。使用Intents将对象从一个活动传递到另一个活动。这就解决了“全局可用”的问题。这还要求您使模型类可打包或可序列化。二. 使用该onSaveInstanceState方法保存活动中对象的状态。恢复方法中的状态onCreate此处描述了此过程。

这种方法的尴尬之处在于每次活动转换时始终写入和读取 Intent 所需的开销和额外代码。

选项2

考虑让单例在每次写入时保留其数据,并在每次读取时从持久性中读取数据。您可以使用多种持久性机制,包括:SharedPreferences、基本文件 I/O 和 SQL 数据库。这些选项在这里讨论:http://developer.android.com/guide/topics/data/data-storage.html。如果您走这条路,我个人发现 SharedPreferences 是最容易使用的。

这是如何完成的示例

public class User {

    //---------------------
    // Singleton implementation.  Note this is just one of several styles
    // of this pattern.
    private static User instance = new User();
    private User() {} // prevent instantiation
    public User getUserInstance() { return instance; }
    //---------------------

    private String category = "user_bean_settings";
    private String emailKey = "email";
    private String nameKey = "name";

    public String getEmail() {
        return readStringProperty(emailKey);
    }
    public void setEmail(String email) {
        writeStringProperty(emailKey, email);
    }
    public String getName() {
        return readStringProperty(nameKey);
    }
    public void setName(String name) {
        writeStringProperty(nameKey, name);
    }

    private String readStringProperty(String prop) {
        Context context = getApplicationContext();
        SharedPreferences prefs = context.getSharedPreferences(category, Context.MODE_PRIVATE);
        return prefs.getString(prop, null);
    }

    private void writeStringProperty(String prop, String value) {
        Context context = getApplicationContext();
        SharedPreferences prefs = context.getSharedPreferences(category, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString(prop, value);
        editor.commit();
    }
}
Run Code Online (Sandbox Code Playgroud)

其中一个尴尬的部分是您需要有一个方便的 Context 引用来访问 SharedPreferences。如何最好地做到这一点由您决定。请记住,活动本身就是上下文,因此您始终可以传递它。有很多不同的方法可以处理这个问题。

======= 问题 2 - dagger2 是创建单例的替代方法吗?... ==========

我查看了 Dagger 2,发现它是一个依赖注入框架。使用 DI 框架有很多好处(松散耦合、可测试性……)。您可以使用 Dagger(或其他 DI 框架,如 RoboGuice)来管理您的单例。如果这是您唯一的目标,我个人认为不值得为集成付出额外的努力。然而,如果您想享受上述 DI 的其他一些好处,那么它可能值得您花时间。请记住,这些并不是免费的,您仍然需要遵循良好的编码实践。无论如何,这似乎有点超出了问题的范围。

  • 我做了一些编辑:1)增强了示例以包括单例模式的实施。2) 简要介绍了 Dagger 和其他 DI 框架。 (2认同)