2012-08-07 11 views
5

¿Cómo se puede retener mejor los datos dentro de un Fragmento ya que su actividad pasa por un ciclo de creación/destrucción como el de la rotación?Fragmentos de Android que retienen datos

En nuestra configuración, tenemos listas potencialmente grandes cargadas desde nuestros servidores en el adaptador de listas personalizadas de fragmentos y queremos suavizar el UX al no hacer que se vuelvan a cargar al girar. El problema que tuvimos al establecer el fragmento retainInstance = true; es que nuestro adaptador tiene una referencia al contexto de la actividad original y, por lo tanto, perdería la memoria. ¿Podríamos simplemente almacenar los datos en el fragmento y volver a crear el adaptador? ¿Y si es así es realmente una buena práctica?

La siguiente idea es almacenar los datos en un objeto singleton de sesión y recuperar después de la rotación, lo que presenta algunos problemas con los datos obsoletos, pero podemos superarlos fácilmente.

La otra alternativa que veo, que parece ser la * mejor solución, es guardar los datos en un paquete y restaurar en el nuevo fragmento después de la rotación; Sin embargo, tenemos bastantes objetos que tendrían que almacenarse en toda la aplicación y algunos de nuestros objetos son complejos, contienen listas, múltiples tipos y sería difícil dividirlos en parcelas. ¿Hay una mejor solución o tenemos que morder la bala y hacer que sea Parcelable?

+0

¿Qué le parece pasar el contexto de la aplicación al adaptador en lugar de la actividad? Si no estás haciendo cosas complicadas con contextos temáticos diferentes, te recomendaría usar el contexto de la aplicación de todos modos, ya que eso no cambiará durante el tiempo de vida de tu aplicación. –

Respuesta

4

Solo evite que la Actividad se recree en rotación (etc.). Agregue

android:configChanges="keyboardHidden|orientation|screenSize" 

a su definición de actividad en su AndroidManifest.xml. Entonces no hay necesidad de guardar nada en la rotación.

EDIT:

Si no le gusta que la solución entonces usted tiene más remedio que utilizar el mecanismo onSaveInstanceState. Si tiene datos complejos, solo haga que sus clases sean serializables y agréguelos al paquete de esa manera.

+3

Como esto se desaconseja en gran medida en la documentación de Android y en otros lugares, no estamos viendo esto como una opción viable. http://developer.android.com/reference/android/app/Activity.html#onRetainNonConfigurationInstance() –

+2

Entonces no tienes más remedio que usar el mecanismo onSaveInstanceState. Si tiene datos complejos, solo haga que sus clases sean serializables y agréguelos al paquete de esa manera. –

+1

Si lo convierte en una respuesta, se aceptará como correcto. La mejor solución es hacer que los datos sean parcelables y usar el estado de guardar la instancia, pero debido a la complejidad esto puede mitigarse utilizando la característica de retención de fragmentos y gestionando más cuidadosamente nuestros recursos de fragmentos para asegurar que no guardemos referencias a la actividad anterior/views (lo que se debe hacer de todos modos como mejor práctica y para mejorar el rendimiento). –

0

Según http://developer.android.com/guide/topics/resources/runtime-changes.html,you completo puede guardar los datos en el fragmento con tal de que no se asocia con la actividad, las vistas, etc. Los paquetes en realidad no están destinados a grandes cantidades de datos y la serialización es lenta, por lo que un fragmento es ideal para grandes cantidades de datos.

Puede que no sea posible para que usted pueda recuperar por completo su estado de actividad con el paquete que el sistema guarda para usted con el onSaveInstanceState() llamada de retorno no está diseñado para transportar objetos de gran tamaño (como mapas de bits) y la los datos que contiene deben serializarse y luego deserializarse, lo que puede consumir mucha memoria y hacer que la configuración cambie lentamente. En tal situación, puede aliviar la carga de reiniciar su actividad conservando un Fragmento cuando su actividad se reinicie debido a un cambio de configuración.Este fragmento puede contener referencias a objetos con estado que desea conservar.

Cuestiones relacionadas