当app意外退出时防止数据损坏

时间:2016-09-04 20:29:56

标签: android save

我目前正在为Android设备开发RPG游戏,并且刚刚实现了一种自定义的序列化方法,用于保存玩家的进度。保存过程可能需要长达半秒的时间,这是发生崩溃的足够时间(由设备引起(即电池电量不足),用户(杀死应用程序)或编写不良的固件/ ROM(内核恐慌) )等)。

在保存播放器的数据时,旧的播放器数据会被覆盖。这意味着如果发生崩溃,并且如果因此取消/中断保存过程,则播放器的数据将丢失。这显然不是理想的,将来,游戏将节省更多的数据,节省的时间会更长。这将增加在保存过程中发生崩溃的可能性。

我无法减少节省时间,因为我正在编写游戏重启应用后能够恢复的最小数据。

我可以采取哪些万无一失的措施来防止此类数据损坏/丢失?

2 个答案:

答案 0 :(得分:2)

您可以将数据保存到SQLiteDatabase。如果对保存数据的更改失败或中断,则数据库将自动回滚到先前已知的状态。

如果您需要以原子方式执行多个更新以获得额外的安全性,请将所有更改放入事务中。如果任何更改失败,整个事务将回滚到事务前状态。

有关使用SQLite的更多信息,请参阅文档here。如果您希望与其他应用共享或将其同步到备用服务器,以便更轻松地处理保存数据,请考虑通过ContentProvider与您的数据进行互动。

答案 1 :(得分:2)

您可以将数据保存在一组临时文件中,并在完成此过程后移动/重命名它们,然后删除以前的保存文件。

如果您对重命名过程没有信心,可以添加以下约束:

  1. 确保数据与校验和一致
  2. 总是尝试从上一次保存的状态恢复,具体取决于您自己的规则(文件名,......)
  3. 另一个想法是将数据切成碎片以隔离不变的状态。 如果保存时间非常长,您可以尝试在游戏过程中使用剩余的CPU时间来预先保存当前状态中可能不会发生变化的部分(例如,使用较低优先级的线程)。