当前位置: 动力学知识库 > 问答 > 编程问答 >

android - Preventing data corruption when app exits unexpectedly

问题描述:

I am currently developing an RPG game for Android devices and have just implemented a custom method of serialisation I use for saving the player's progress. The saving process can take up to half a second which is enough time for a crash to occur (either caused by the device (i.e. low battery power off), the user (killing the app) or a poorly written firmware/ROM (kernel panics) etc).

While saving the player's data, the old player data is overwritten. This means if a crash was to occur, and if the saving process were to be cancelled/interrupted as a result, the player's data would be lost. This is obviously not ideal and in the future, the game will be saving a lot more data and the save time will be much longer. This will increase the chance of a crash occurring during the save process.

I cannot reduce the save time as I am writing the minimal data the game requires to be able to resume after the app has been restarted.

What foolproof measures, if any, can I take to prevent such data corruption/loss from happening?

网友答案:

You can save your data in a temporary set of files and moving/renaming them when the process is complete, then deleting the previous save files.

If you're not confident with the renaming process, you can add these constraints :

  1. ensure that data is consistent with a checksum
  2. always try to resume from the last consistent saved state, depending on a rule of your own (name of the file, ...)

Another idea would be to cut into pieces your data in order to isolate state that do not change. If save time is really long, you can try to use remaining CPU time during the game to pre-save parts of the current state that won't probably change (using a lower priority Thread, for instance).

网友答案:

You can save data to a SQLiteDatabase. If changes to the save data fails or is interrupted, the database will automatically be rolled back to a previous known state.

For additional security if you need to perform multiple updates atomically, put all your changes into a transaction. If any of the changes fail, the entire transaction will be rolled back to the pre-transaction state.

For more information about using SQLite, see documentation here. For easier manipulation of your save data in the event you want to share it with other apps or sync it to a backup server, consider interacting with your data via a ContentProvider.

分享给朋友:
您可能感兴趣的文章:
随机阅读: