Me pregunto qué estrategias usan otros para evitar la pérdida de datos al guardar archivos en Android. Tengo un par de aplicaciones de juegos que, en esencia, pueden guardar el estado del juego/guardar juego cada vez que el usuario hace una pausa (onPause).¿Evita la pérdida de datos debido a la interrupción al guardar archivos en android?
Esto funciona en el 99,99% de los casos, pero de vez en cuando recibo un ejemplo de un juego guardado donde el proceso de guardado ha sido incorrecto. Por lo general, este es un archivo XML mal formado, normalmente truncado en algún punto arbitrario. Basado en los informes de errores que recibo, creo que el problema ocurre principalmente cuando el usuario es interrumpido durante el juego por una llamada telefónica o algo así y el sistema operativo Android mata la aplicación antes de que pueda terminar de guardar. El código para guardar los archivos es bastante simple, así que tengo dificultades para ver qué más podría causar este problema.
Esto es un problema grave, ya que generalmente se arruinará el progreso de guardado del jugador.
Estaba pensando en escribir primero en un archivo vacío y luego copiarlo al archivo "real" solo después, pero sospecho que eso simplemente aumentaría el problema, ya que en general tomará más tiempo y aún corre el riesgo de ser interrumpido.
¿Alguien que tiene una manera segura de hacer esto que Android está relativamente garantizado para no ensuciar?
Así resumida, las opciones sugeridas hasta ahora (como yo las entiendo):
- utilizar un servicio para el proceso de guardado, en el supuesto de que esto va a ser menos propensos a ser asesinados por el OS.
- Guardar en archivo temporal; copiar cuando se haya guardado.
- Ahorro incremental del estado del juego (de hecho, ya lo uso para la información de registro del jugador).
- Combinación de 2 & 3.
- Mueva el guardado a otro subproceso, ya que el problema puede ser con ANR elimina [los comentarios de DC a continuación].
No creo que las Preferencias Compartidas funcionen para este tipo de datos estructurados. Por el momento, ninguno de estos métodos parece una solución ideal, por lo que todavía estoy abierto a sugerencias.
todavía no las he arreglado para poner a prueba todos estos enfoques, por lo que en lugar de perder la recompensa, he asignado a la respuesta que me siento que sería más probable para resolver el problema. Sin embargo, planeo revisar las diversas opciones antes de aceptar una respuesta. Gracias por todas las buenas sugerencias.
demasiados datos para ser guardados en 'SharedPreference'? – Ronnie
Sí - alrededor de 20K de datos en XML. Es posible que no sea un problema importante (no lo haya intentado), pero creo que la compleja estructura de los datos sería. –
¿Cómo está guardando el estado del juego en 'onPause()'? ¿Estás haciendo E/S en el hilo principal (UI)? ¿Dónde está guardando el estado del juego (en la tarjeta SD u otra ubicación)? –