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

时间:2015-07-02 12:40:50

标签: 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;   }
}

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

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

由于

2 个答案:

答案 0 :(得分:3)

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

在Android中使用Singletons有很多陷阱。其中最大的是Android管理应用程序的生命周期。因此,任何活动都可以随时销毁。或者,如果出于其他目的需要内存,Android甚至可能会选择终止您的进程。 Android将恢复您的应用/活动,但如果您不执行任何操作,状态将丢失。在进程终止方案中,您有一个新的VM实例,并且Singleton对象中的任何状态都将丢失。当然,如果您谨慎编码,则可以确保使用正确的状态适当地重新创建这些代码。这可能很难并容易出错。

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

选项1。

我。使用Intents将对象从活动传递到活动。这解决了"全球可用"问题。这还需要您制作模型类Parcelable或可序列化。 II。使用onSaveInstanceState方法保存活动中对象的状态。使用onCreate方法恢复状态。此过程描述为here

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

选项2

考虑让你的单身人士在每次写作时保持他们的数据,并从每次阅读的持久性中读取。您可以使用多种持久性机制,包括:SharedPreferences,Basic File I / O和SQL Database。这里讨论了这些选项: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();
    }
}

这个尴尬的部分是你需要一个方便的参考来访问SharedPreferences。如何最好地做到这一点就是你的电话。请记住,活动本身就是上下文,所以你总能通过它。有很多不同的方法可以解决这个问题。

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

我看着Dagger 2,发现它是一个依赖注入框架。使用DI框架有许多好处(松散耦合,可测试性......)。您可以使用Dagger(或其他DI框架,如RoboGuice)来管理您的单身人士。如果那是您的唯一目标,我个人认为不值得进行额外的整合工作。但是,如果你想享受上面提到的DI的其他一些好处,那么它可能值得您光顾。请记住,这些不是免费的,您仍然需要遵循良好的编码习惯。不管怎样,这似乎已经超出了问题的范围。

答案 1 :(得分:0)

bound service是一个很好的解决方案。客户端将它绑定到Application上下文,因此"任何活动,类或片段都可以访问同一个实例。"

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