0

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

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

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

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

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

谢谢!

编辑:

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

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

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

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

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

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

你怎么看?

4

1 回答 1

0

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

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

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

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

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

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

的,持久保存用户的数据/首选项要好得多。 在 android 中,您需要使用Shared Preferences来做到这一点!

你可以找到如何使用的例子SharedPreferences

如何在 Android 中使用 SharedPreferences 来存储、获取和编辑值

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

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

于 2014-02-21T23:08:05.630 回答