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是创建单身人士的替代方案吗?
谢谢
============ 问题 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 的其他一些好处,那么它可能值得您花时间。请记住,这些并不是免费的,您仍然需要遵循良好的编码实践。无论如何,这似乎有点超出了问题的范围。