在android上保存文件时避免因中断而导致的数据丢失?

Mic*_* A. 15 xml android file

我想知道其他人在Android上保存文件时使用什么策略来避免数据丢失.我有几个游戏应用程序,基本上,只要用户暂停(onPause),它们就可能保存游戏状态/存档游戏.

这种情况在99.99%的情况下有效,但每隔一段时间我就会收到一个存储过程出错的存档游戏示例.通常,这是一个格式错误的XML文件,通常在某个任意点被截断.基于我收到的错误报告,我认为问题主要发生在用户在游戏过程中通过电话或类似的东西中断时,Android操作系统会在应用程序完成保存之前杀死应用程序.保存文件的代码非常简单,因此我很难看到其他可能导致此问题的原因.

这是一个严重的问题,因为它通常会导致玩家的保存进度被破坏.

我想先写一个空文件,然后再复制到"真实"文件,但我怀疑这只会增加问题,因为它总会花费更多时间,但仍然有被打断的风险.

谁有安全的方法来做到这一点Android相对保证不会搞砸?


总结一下,到目前为止建议的选项(据我所知):

  1. 使用服务进行保存过程,假设操作系统不太可能将其杀死.
  2. 保存在临时文件中; 验证保存时复制.
  3. 增量保存游戏状态(我实际上已经将此用于播放器日志信息).
  4. 2和3的组合.
  5. 将保存移动到另一个线程,因为问题可能是ANR杀死[DC的评论如下].

我不认为SharedPreferences会对这种结构化数据起作用.目前,这些方法似乎都不是理想的解决方案,所以我仍然愿意接受建议.


我还没有设法测试所有这些方法,所以我没有浪费赏金,而是将其分配给我认为最有可能解决问题的答案.不过,我计划在接受答案之前检查各种选项.感谢所有好的建议.

a.c*_*ch. 3

我认为在这种情况下,每次用户执行任何操作(不仅仅是在调用时)将一小部分数据(而不是整个游戏状态)保存到数据库中将onPause()是最好的方法。然而,这可能需要对代码进行大量修改。

折衷方案是将游戏状态分成更小的部分或子状态(比如说,,,,round1... round2players等等),并在用户执行任何操作时再次将数据存储到适当的文件,而不是等待调用onPause()。这将大大降低丢失的可能性,至少可以保证用户不会丢失整个游戏进度。此外,为了避免在保存过程中断时可能出现应用程序状态不一致的情况,您最好先将数据保存到临时文件,并且仅在成功的情况下才重命名该文件,而不是复制其内容(比方说,重round1.xml.tmp命名)到round1.xml)。