Design patterns 如何使用dagger2设置和获取模型类的单例对象?

Design patterns 如何使用dagger2设置和获取模型类的单例对象?,design-patterns,dagger,dagger-2,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; }

在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;   }
}
我希望数据一旦存储在模型类中,就可以在任何活动、类或片段中检索。我应该使用单例,还是有更好的方法

dagger2在这种情况下有效吗?dagger2是创建单例的替代方案吗


谢谢

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

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

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

选项1。

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

这种方法的尴尬之处在于每次活动转换时总是向意图写入和从意图读取所需的开销和额外代码

选项2

考虑让您的单例在每次写入时持久化数据,并在每次读取时从持久化读取数据。您可以使用多种持久性机制,包括:SharedReference、基本文件I/O和SQL数据库。此处讨论了这些选项:。如果你走这条路,我个人发现共享引用是最容易使用的

下面是一个如何实现的示例

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();
    }
}
其中一个棘手的部分是,您需要一个方便的上下文引用来访问SharedReference。如何最好地做到这一点是你的电话。请记住,活动本身就是上下文,所以您可以随时传递它。有很多不同的方法来处理这个问题

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

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

a将是一个好的解决方案。客户端将其绑定到应用程序上下文,以便“任何活动、类或片段”都可以访问同一实例


此解决方案将避免必须序列化到/从Intent的开销。如果您不需要,它还可以避免持久性的开销。

您可以告诉我如何使用dagger2来避免单例?一个示例代码将对我很有帮助1)抱歉,但我不熟悉dagger2。2) 对于选项#1,提供的链接应该有足够的信息,3)对于选项#2,我将在一分钟内发布一个示例…我做了一些编辑:1)增强了示例,以包括单件模式的实施。2) 提供了一些关于Dagger和其他DI框架的内容。