2012-04-03 57 views
0

这更多的是对您的意见的要求,而不是问题。 这将是有点,所以不用担心,如果你没有耐心读一遍。 停在这里,如果你不我目前使用共享偏好来频繁存储一些值,逐一,我的应用程序的执行过程中:)Android。共享首选项。崩溃情况下检索到的损坏数据

。实际上,每2秒钟这些值就会改变,并且需要将它们存储在首选项中,以便用户在关闭应用程序并重新打开应用程序后,可以从停止的位置继续。

我曾经想过的一个问题是,如果有机会强制关闭应用程序,例如电池在值被保存时死亡,那么当用户试图从他离开的地方恢复时,数据无效,因为它之前没有完全保存(例如,只有5个值中的2个被存储)。

我想如何解决这个问题是保存数据两次,在“两个时隙”(我的意思是插槽是每个值,就像我说过有多个值,将存储在“valueName_1 “或”valueName_2“),并且在正常值存储旁边,我还将在首选项内保存两个值,这些值将用于验证数据是否完全保存。 其中这两个值curSavingSpot将参照位置在这两个插槽在那里我已经最后保存(或曾尝试在情况下保存的失败)的一个值,而其他curSavedSuccessfully将跟踪如果LAST存储值全部是成功存储的

例如:

  • 最初在共享县每个字段为空。 curSavingSpot指向1(第一个“slot”),curSavedSuccessfully为false。
  • 我开始在插槽1中保存价值和保存完成他们不会受到任何干扰,所以curSavedSuccessfully将作为我们已经成功保存的值

  • 2秒后发虚,我开始保存新的值。这次是插槽2.但首先,我将curSavingSpot的值设置为2和curSavedSuccessfully为false。让我们说,当我保存5个值中的3个(还有2个值)时,设备崩溃。当我重新启动它时,我会首先检查上次保存会话是否成功完成,根据curSavedSuccessfully没有发生,所以我看curSavingSpot并采取相反的值,在这种情况下,我知道2还没有完成所以这意味着1有正确的值。

您怎么看?这是做这件事的好方法吗?有没有更好的方法确保它保存了所有必需的值?

有什么建议吗?这个想法有什么缺陷吗?

对不起,很长的文章。

回答

4

老实说,我听起来像是你在推翻它。 SharedPreferences的commit()apply()声称是原子的,这意味着对SharedPreferences的所有更改都会发生,或者它们都不会发生。只要你不是多次调用commit()(在完成所有更改后),你应该没问题。基本上你只能提交一些偏好的场景永远不会发生。如果您的值在单独提交时无效,则逐个提交它们是没有意义的,只需在它们都准备好提交时提交即可。

如果你想审核你的提交,你也可以使用一个数据库(并且总是选择最后一个时间戳)。 SQLite有atomic commits,你可以在这里阅读更多关于原子提交意味着什么,以及为什么它永远不会写入行的一部分。

1

我建议您使用“内部存储”进行某种备份。我假设它比“共享偏好”慢一点,但是内部存储是为了以更大的数量存储数据而做出的,并且正如其名称所指出的,偏好(有限的一组信息,不会频繁变化)的共享偏好。

因此:我会使用内部存储来存储应用程序的值每分钟左右,以及共享首选项之间的小增量步骤。有了这个,你甚至可以提供进一步的备份而不仅仅是一步。

并且可能用户不会仅仅因为杀死他们正在运行的应用程序,所以我认为你的应用程序被杀死的情况非常罕见。还有其他一些功能onDestroy(),您可以在其中保存所有内容。

干杯!

+1

你不能使用onDestroy来保存重要的数据 - 它不保证被调用。唯一可以保证的是,当用户离开你的活动时,onSaveState被调用。有一个旧的,但仍然是实际的,很好的主题http://android-developers.blogspot.ru/2010/04/multitasking-android-way.html – Deepscorn 2015-10-29 08:25:46