存储自定义对象的最佳位置,以便所有活动都可以看到它们

Best place to store custom objects so all activities can see them

我是一名正在努力学习 Android 的 iOS 开发人员,我想确保自己遵循最佳实践。

我有需要由 1 -> m 活动访问的自定义对象,并且需要在应用程序关闭时保存它们。目前我正在使用下面的代码 SharedPreferences 来保存它们,但我不确定这是否是最佳途径。我应该使用单例吗?有没有更好的方法?

SharedPreferences  mPrefs = getPreferences(MODE_PRIVATE);
Editor prefsEditor = mPrefs.edit();
Gson gson = new Gson();
String json = gson.toJson(userProfile);
prefsEditor.putString("UserProfile", json);
prefsEditor.commit();

gson = new Gson();
json = mPrefs.getString("UserProfile", "");
UserProfileObject outObject = gson.fromJson(json, UserProfileObject.class);

应用程序退出时不会保存单例。实际上,您的选择是:

*共享首选项。适用于少数 key/value 对

*数据库。适用于关系数据

*磁盘上的文件,您喜欢的任何格式。适用于任何数量的数据,但您可能需要编写自定义解析器。

在共享首选项中存储 json 有点奇怪。只要您没有在其中存储很多密钥,这并不可怕,但这会让您看起来好像不知道如何编写文件。

@Gabe 给出了很好的答案。我正在添加我的 2 美分

我个人不喜欢在 SharedPreferences 中保存序列化数据。相反,我会使用本地数据库存储(例如 SQLite 或 Realm)来存储它。 serialisation/deserialisation 的原因涉及 marshalling/unmarshalling 个使用反射的对象,这可能会对性能产生负面影响。

简而言之,使用本地数据库存储复杂/关系数据,使用 SharedPreferences 存储简单数据

我认为如果你的 UserProfileObject 可以很容易地从 Json 构建并且它不包含任何敏感数据(即密码),那么将它放在 SharedPreferences 中可能没问题(只需像您正在做的那样保存 json 字符串)。

使用单例 SessionManager / ProfileManager class 就足够了。即使它可能被 1 -> m 活动使用,它也只会在使用单例时命中 SharedPreferences 一次。只要确保在发生更改时保持单例和 SharedPreferences 中的数据副本同步即可。或者只是将单例全部转储在一起并在每次需要时点击 SharedPreferences(减少对保持副本同步的担忧),不要认为您的用例会影响它那么多。