Después de pasar por un libro introductorio de programación de Android, quería modificar la aplicación de ejemplo para solidificar mi comprensión de algunos temas que realmente no estaban cubiertos. Al hacer el cambio, cometí un error, pero tengo curiosidad por saber por qué el error funcionó en algunos casos, pero no en otros.¿Por qué a veces funciona el guardar una Hashtable de objetos no Parcelable en onSaveInstanceState()?
Una actividad dentro de la aplicación almacena una serie de preguntas en un Hashtable<Integer, Question>
, donde Question es una clase pequeña que contiene un int y dos cadenas. Como se escribió originalmente, la actividad descarga las preguntas de un servidor en cada onCreate()
, por lo que quería implementar onSaveInstanceState()
para evitar algunas descargas redundantes. onSaveInstanceState()
guarda el Hashtable en el paquete usando putSerializable()
.
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// mQuestions is a member variable of
// type Hashtable<Integer, Question>
if (mQuestions != null && mQuestions.size() > 0) {
outState.putSerializable(SAVED_QUESTIONS, mQuestions);
}
}
Funcionó perfectamente para los cambios de orientación de la pantalla incluso antes de saber qué era una Parcelable o cómo implementarla. Solo sabía que había un problema cuando presioné la tecla de inicio del emulador y la aplicación silenciosamente, se bloqueó de manera invisible sin salida de LogCat. El seguimiento de la pila me llevó a buscar Parcelable y hacer que Question lo implemente.
Mi pregunta no es qué hice mal. La pregunta es la siguiente: Cuando la clase Question no implementó Parcelable, ¿por qué la aplicación se bloqueó solo al presionar Inicio y no en la orientación de la pantalla cambiar?
"onSaveInstanceState() guarda la tabla hash en el paquete usando putSerializable()". - No coloque su modelo de datos en estado de instancia. Pon tu modelo de datos en un archivo o una base de datos. Así es como "previene descargas redundantes". "Solo sabía que había un problema cuando presioné la tecla de inicio del emulador y la aplicación silenciosamente, se bloqueó de manera invisible sin salida de LogCat". - y tu prueba de este choque silencioso e invisible es ... ¿qué, exactamente? – CommonsWare
@CommonsWare: apareció una ventana emergente en Eclipse que solicitaba abrir la perspectiva Debug porque el lanzamiento se había suspendido. Así es como supe que se estrelló. He comentado el código para hacer la pregunta parcelable, y en un intento (de varios), se forzó a cerrar con los errores registrados, pero eso no sucedió antes de publicar esta pregunta. – erichamion
Sí, los datos realmente deberían guardarse en un archivo, pero eso no es lo que estaba tratando de hacer. No estoy trabajando en una aplicación de producción (incluso para uso personal, hobby). Estaba modificando la aplicación de demostración creada a través del desarrollo de la aplicación Teach Yourself para Android de _Sam en el libro de 24 horas_. Incluso para un libro introductorio, parece dejar de lado algunos temas muy básicos. Quería ver cómo funciona onSaveInstanceState(). Creo que ahora tengo los mecanismos para ello, sino cuándo y cómo usarlo. – erichamion