gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:38:22 26 4
gpt4 key购买 nike

我有哪些选项可以在 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 中使用 Singleton 有很多陷阱。其中最重要的是 Android 管理您的应用程序的生命周期。因此,任何事件都可能随时被破坏。或者,如果出于其他目的需要内存,Android 甚至可能会选择终止您的进程。 Android 将恢复您的应用程序/事件,但是如果您什么都不做,状态就会丢失。在 process-kill 场景中,您有一个新的 VM 实例,并且 Singleton 对象中的任何状态都丢失了。当然,如果您仔细编码,则可以确保以正确的状态适本地重新创建这些。这可能很难且容易出错。

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

选项 1。

一世。使用 Intents 将对象从事件传递到事件.这解决了“全局可用”的问题。这也将要求您创建模型类 Parcelable或可序列化。
ii.使用 onSaveInstanceState方法来保存事件中对象的状态。恢复 onCreate 中的状态方法。这个过程描述here .

这种方法可能令人尴尬的是在每次事件转换时始终写入和读取 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();
}
}

一个尴尬的部分是你需要有一个方便的上下文引用来访问 SharedPreferences。如何最好地做到这一点是你的电话。请记住,事件本身就是上下文,因此您始终可以通过它。有很多不同的方法可以处理这个问题。

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

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

关于design-patterns - 如何使用 dagger2 设置和获取模型类的 Singleton 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31184970/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com