Мне интересно, какие стратегии используют другие, чтобы избежать потери данных при сохранении файлов на Android. У меня есть несколько игровых приложений, которые, по сути, потенциально могут сохранить состояние игры/сохранить игру всякий раз, когда пользователь делает паузу (onPause).
Это работает в 99,99% случаев, но каждый раз в то время я получаю пример savegame, в котором процесс сохранения поступил неправильно. Обычно это плохо сформированный XML файл, обычно усеченный в некоторой произвольной точке. Основываясь на отчетах об ошибках, которые я получаю, я считаю, что проблема в основном возникает, когда пользователь прерывается во время игры с помощью телефонного звонка или что-то в этом роде, а ОС Android затем убивает приложение, прежде чем он сможет завершить сохранение. Код для сохранения файлов довольно прост, поэтому мне трудно понять, что еще может вызвать эту проблему.
Это серьезная проблема, потому что это обычно приводит к тому, что игрок сохраняет прогресс, который разрушается.
Я думал сначала писать в пустой файл, а затем копировать в "настоящий" файл только после этого, но я подозреваю, что это просто увеличит проблему, так как в целом это займет больше времени и все равно рискует прерваться.
Любой, у кого есть безопасный способ сделать это, что Android относительно гарантированно не испортить?
Итак, все варианты, предложенные до сих пор (как я их понимаю):
- Используйте службу для процесса сохранения, исходя из предположения, что она будет менее вероятна для уничтожения ОС.
- Сохранить во временном файле; копировать, когда сохранение подтверждено.
- Инкрементное сохранение состояния игры (я на самом деле уже использую это для информации журнала игрока).
- Комбинация 2 и 3.
- Переместите сохранение в другой поток, так как проблема может быть с ANR убивает [комментарии DC ниже].
Я не думаю, что SharedPreferences будут работать для такого рода структурированных данных. На данный момент ни один из этих методов не кажется идеальным решением, поэтому я по-прежнему открыт для предложений.
Мне еще не удалось проверить все эти подходы, поэтому вместо того, чтобы тратить деньги, я назначил его на ответ, который, по моему мнению, скорее всего решит проблему. Тем не менее, я планирую проверить различные варианты, прежде чем принимать ответ. Спасибо за все хорошие предложения.