8

No entiendo muy bien este negocio de ciclo de vida de fragmentos.¿Por qué se llama mi fragmento onCreate extensivamente cada vez que paso por mis aplicaciones viewPager?

Tengo una vista deslizante horizontal de 3 páginas bastante estándar para visualizar una sección de "vista de detalles" de mi aplicación. Inicié mi aplicación en la página intermedia de los tres. Mi FragmentActivity establece la página a la página 1.

mPager.setCurrentItem(1); //default to center page, current data view fragment 

He estado usando el FragmentStatePagerAdapter porque el uso de la FragmentPagerAdapter estrelló mi aplicación a veces, al volver de un estado de suspensión, por ejemplo, y esto era la forma más rápida trabajar alrededor de eso por ahora. Parece que funciona, pero sospecho que el aspecto de Estado es lo que podría ser la causa de mi problema aquí, tal vez.

Así que al principio pensé que haría que cada fragmento hiciera el trabajo de obtener datos de un servicio de descanso y luego mostrarlos en una lista, pero ya no estoy tan seguro.

Intenté ejecutar una tarea asíncrona única para obtener datos en cada uno de los fragmentos de los eventos de creación de vistas. Luego, después de leer más sobre el ciclo de vida del fragmento, cambié a onCreate, habiendo notado que onCreateView estaba siendo llamado bastante, lo que a su vez hizo una aplicación codiciosa que con demasiada frecuencia solicitaba datos por cable.

El cambio a onCreate no ha cambiado nada. OnCreate todavía se llama llamado tanto como onCreateView para los 2 fragmentos adyacentes.

Lo curioso es que el fragmento que configuro para ser el primero en mostrarse en Fragment Activity solo obtiene el onCreate llamado one time.

Algo no se siente bien aquí.

En este momento estoy pensando que debería tener la actividad de fragmento padre declarar y llamar a todas las tareas asíncronas para obtener los datos que necesito mostrar en los fragmentos. Establezca los resultados de las llamadas asincrónicas en un objeto propiedad de la actividad del fragmento principal y haga que los fragmentos usen el objeto contenido por el padre para crear la vista de lista, etc.

¿Pero qué ocurre si las tareas asincrónicas comienzan por el padre la actividad no termina antes de cada onCreateView fragmentos se llama y el objeto contenida por el padre no está listo todavía .....

firmado, confundido y frustrado

Respuesta

25

ViewPager es muy celoso en el cierre de cosas, no está usando actualmente, y esto es exactamente lo que está sucediendo aquí. El comportamiento predeterminado es que ViewPager "guarde" una página a cada lado de la página que se está viendo y destruya el resto. Por lo tanto, en su vista de 3 páginas, la página 3 se destruye al seleccionar la página 1, luego cuando se vuelve a seleccionar la página 2, se recrea la página 3. Como habrás notado, en la página 2 solo se ha llamado al onCreate(..) una vez porque siempre está adyacente a, o es, la página seleccionada actualmente.

Para solucionar esto, simplemente configure ViewPager.setOffscreenPageLimit(2). Entonces ViewPager guardará todos tus Fragmentos. Obviamente, esta no es una buena idea para una gran cantidad de Fragmentos, pero para su caso debería estar bien.

+0

oh ya, eso suena útil para probar. así que, oye, ¿disparar las tareas asíncronas de un fragmento de Crear parece una forma estándar de hacer las cosas? en este momento disparo tres tareas asíncronas separadas una vez que se carga mi fragmento, correcto o incorrecto ... – topwik

+0

Sí, el único problema que podría ver con eso es si un usuario gira el dispositivo cuando se está ejecutando AsyncTask. Sin embargo, no tengo mucha experiencia con ellos. Vale la pena revisar la clase AsyncTaskLoader, creo que las clases de Loader automatizan muchas cosas para ti. –

+0

También estoy atrapado en este tema. Ahora tengo que trabajar. Muchas gracias. – Durai

2

@ La solución de Espiandev funcionará para su caso actual, pero tiene razón en que su estado es el problema. Debe utilizar los métodos setArgument y/o onSaveInstanceState para guardar el estado de Fragment (que no debería ser demasiado difícil, ya que p. Ej., una respuesta del servidor generalmente se puede representar como una Cadena), y luego use getArgument y/o Bundle pasado en onCreate para restaurarlo.

Alternativamente, usted podría tener su Activity haga el servidor recupere, y luego llamar setArgument para cada uno de sus fragmentos, y comprobar los argumentos dentro de su Fragment para determinar si sus datos han llegado todavía (y si no, lo que podría mostrar una carga estado de algún tipo).

Si le preocupa el cambio de orientación de la pantalla, this related question también le será útil.

+0

gracias, hombre. Aprecio la respuesta. quería continuar con "¿y si tuviera muchos más fragmentos en este buscapersonas" ... – topwik

Cuestiones relacionadas