我有什么选项可以在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是创建单身人士的替代方案吗?
由于
答案 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序列化的开销。如果你不需要它,它也可以避免持久性的开销。