【问题标题】:Android Singleton for "User data" saved to JSON file将“用户数据”的 Android Singleton 保存到 JSON 文件
【发布时间】:2014-02-21 22:17:02
【问题描述】:

现在,我的应用正在使用单例类“UserData”来维护用户偏好和设置。每次进行更改时,我都会将所有数据保存到 JSON 文件中。所以,我所有的 setter 都调用 saveToFile()。

这工作得很好,但我只是不喜欢每次调用 setter 时都进行保存。我也宁愿不必在各种活动和片段中放置代码来调用方法来自己保存数据。

理想情况下,我希望单例在应用程序关闭(或关闭/销毁)时保存数据。我还有一个 Application 类,用于跨活动保留一些对象,但我没有看到应用程序关闭或被销毁时的回调。

有没有一种可靠的方法可以让单例知道它什么时候被销毁,这样它就可以在那个时候保存数据?我想确保它永远不会丢失对其用户数据的更改。

或者,有没有比使用单例更好的方法?

谢谢!

编辑:

SharedPreferences 不是一个好的选择,因为:

  1. 我要保存三个字符串数组列表,它们只添加了对 API 11+ 的支持。 JSON 可以很好地处理数组。
  2. 它做同样的事情,除了它将它保存为 XML 数据而不是 JSON。由于它将数据保存到一个文件中,因此每次更新字段时,它仍然必须一次保存整个内容。
  3. 我想我可以做得更好。

所以,我修改了我的实现,以便我的基 Activity 类覆盖 onStop() 以在我的 Singleton 中调用 onSave()。当一个字段被修改时,它会设置一个标志,并且只有在设置了该标志时才保存数据。

对 Singleton 的引用由我的 Application 类作为静态变量进行管理。它在应用程序启动时读取数据。

我还对其进行了修改以进行异步保存。

我不明白这怎么会失败,除非由于内存问题,Android 在没有调用任何生命周期方法的情况下终止了应用程序。

你怎么看?

【问题讨论】:

标签: android savestate application-singleton


【解决方案1】:

我没有看到应用程序关闭或销毁时的回调

不幸的是没有这样的回调。如果有这样的回调可能会很有用,但不是出于您认为需要的原因。

有没有可靠的方法让单例知道它什么时候被销毁,这样它就可以在那个时候保存数据?

不,单例基本上是某个类的静态字段,除非您显式释放它(通过将其设置为 null),否则当操作系统决定终止您的进程时,操作系统会将其与进程的整个内存堆分配一起垃圾收集过程。在那个阶段,您将无法控制您的应用程序。

确实有办法注册到onTrimMemory 组件回调,什么可以给你暗示你的进程成为被操作系统杀死的候选者。我想在进程被杀死之前使用它来执行重要的 IO 操作作为在文件上保存数据可能是一个很好的操作。

有没有比使用单例更好的方法来做到这一点??

是的,有更好的方法可以持久保存用户的数据/偏好。 在 android 中,您需要使用 Shared Preferences 来做到这一点!

您可以找到如何使用SharedPreferences 的示例音调:

How to use SharedPreferences in Android to store, fetch and edit values

http://www.vogella.com/tutorials/AndroidFileBasedPersistence/article.html

使用SharedPreferences 将解决您的所有问题,并完全消除您对单例类的需求。 你也不需要管理自己的特殊文件,并从他那里写/读 - SharedPreferences 为你自动完成,并且易于使用。

【讨论】:

  • 谢谢。我将需要研究 SharedPreferences,尽管我可能仍会使用单例(或者可能只是具有静态方法的类)来封装功能。
  • 感谢和努力由 +1 表示赞赏;)
  • 实际上,SharedPreferences 对我的需要来说太有限了。我更新了原始问题。谢谢,但我需要更多信息,而不仅仅是“使用 Android 中已有的 API”。
  • @Rick Falck:如果您需要保存大量数据 - 那么最好使用 SQLite 数据库,而不是共享首选项。只是为了让您知道 - 如果您的数组是固定大小的,而不是那么大 - 您仍然可以在共享首选项中将字符串保存为 json。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 2015-10-04
  • 2021-05-05
  • 2017-07-23
  • 2020-12-17
  • 2013-07-12
  • 1970-01-01
相关资源
最近更新 更多