A veces no obtiene la devolución de llamada onCreateLoader después de llamar a initLoader

Tengo una actividad que llama a initLoader cuando se crea para cargar los datos que la actividad mostrará. Normalmente, esto funciona bien. Tengo puntos de interrupción fijados para ver la orden que todo sucede. Primero llamo initLoader, luego obtengo la devolución de llamada OnCreateLoader, luego la devolución de llamada OnLoadFinished, entonces todo es genial.

Sin embargo, me di cuenta de que si cambié la orientación en mi Android que no recibo la devolución de llamada OnCreateLoader o la devolución de llamada OnLoadFinished, lo que resulta en ningún dato se muestra en la página. Todavía obtengo mi punto de interrupción en la llamada de initLoader, así que sé que está sucediendo, pero no obtengo un error y no puedo encontrar ninguna documentación explicando por qué no recibiría una devolución de llamada después de llamar a initLoader.

Curiosamente, no obtener los devoluciones de llamada si vuelvo a la orientación original.

Por lo tanto, para resumir:

Empiezo la actividad en orientación vertical

  • Llamo initLoader
  • Recibo onCreateLoader y las devoluciones de llamada onLoadFinished

Luego cambio al paisaje

  • Llamo initLoader
  • No onCreateLoader o las devoluciones de llamada onLoadFinished

Vuelvo al retrato

  • Llamo initLoader
  • Recibo onCreateLoader y las devoluciones de llamada onLoadFinished

Del mismo modo, si inicio la actividad en modo horizontal obtendré las devoluciones de llamada. Entonces, si cambio al retrato, no lo hago. Entonces, si cambio de nuevo al paisaje consigo las devoluciones de llamada otra vez.

¿Alguien tiene alguna idea de lo que está pasando?

Hemos visto este mismo problema con Fragmentos en un ViewPager. Parece que los cargadores no se activan de nuevo correctamente cuando se reanuda un fragmento. De hecho, cuando el fragmento está pausado, nuestro CursorLoader ya no obtiene las devoluciones de llamada de ContentObserver como yo esperaría.

Nuestra solución ha sido llamar a restartLoader () que descarga el contenido anterior y vuelve a cargar los datos. Esto tendría el mismo efecto neto que destroyLoader (); InitLoader (), pero será más eficiente.

Tendrás que llamar a initLoader en tu onCreate

Para un problema similar y más información echa un vistazo a LoaderCallbacks.onLoadFinished no se llama si ocurre el cambio de orientación durante la ejecución de AsyncTaskLoader

He estado rastreando este problema

Creación inicial (OnActivityCreated)

InitLoader -> OnCreateLoader -> OnOnStartLoading -> OnLoadFinished

Cambio de orientación – OnActivityCreated se llama de nuevo

InitLoader – OnLoadFinished (Sin cargar ningún dato!) – bug.

La única solución que he encontrado es llamar a destroyLoader () justo antes del init. Esto obliga a que se produzca la secuencia adecuada de creación / inicio / finalización.

Lo que parece estar sucediendo es que el código de initLoader está escrito para suponer que el fragmento no se destruye durante un cambio de orientación, lo cual no es, por supuesto, cómo funciona el resto de android.

Tenía algo muy similar sucediendo con los adaptadores del cursor en fragmentos en cambio de la orientación. Initloader se llamó en onCreateView (también probado onStart y onResume), pero onCreatLoader, así como los otros métodos de retorno de llamada de cargador nunca fueron llamados. También de la nota en mi caso el fragmento estaba contenido en un paginador de vista.

Así que inicialmente se creó la actividad y el buscapersonas y los fragmentos y todo funcionó. En el cambio de orientación aunque las listas en mis fragmentos no obtendría datos. Cambiar la orientación de nuevo y los datos regresaron.

En mi caso la solución cambiaba esto:

getActivity().getLoaderManager().initLoader( 0, null, this ); 

Lo cambié a esto

 getLoaderManager().initLoader( 0, null, this ); 

Esta es una vieja pregunta, pero tal vez alguien podría todavía se preocupa … Tuve el mismo problema y fue capaz de arreglarlo. Aquí está el enlace: onCreateLoader no se llama cuando los cambios de orientación

Pasé semanas en el seguimiento de este problema. Se cansó de poner el contenido fragmento anterior a mi nuevo fragmento. Finalmente fijo.

En mi método onCreate () de que fragmento implementado LoaderManager, hice esto

  getLoaderManager().initLoader(0, null, this); if(!getLoaderManager().getLoader(0).isReset()) { getLoaderManager().restartLoader(0, null, this); } 

Funciona cuando el cargador nuevo no se activó correctamente.

Tuve este problema recientemente, y me gustaría enviar mi solución.

Me pareció que era simplemente suficiente para hacer:

  Loader<Cursor> loader = getActivity().getLoaderManager().getLoader(LOADERID); if (loader == null) { getActivity().getLoaderManager().initLoader(LOADERID, null, this); } else { getActivity().getLoaderManager().restartLoader(LOADERID, null, this); } 
  • La orientación del paisaje bloqueado en la actividad tablet + se inició cuando el dispositivo en vertical = rotación visible en la pantalla
  • El diseño de Xml cambia al cambiar la orientación
  • Diseño diferente para la orientación "Paisaje" y "Orientación horizontal"
  • Comportamiento extraño con el sensor de orientación de Android
  • Problema del ciclo de vida con cambio de orientación en otra actividad
  • Cambiar la configuración de Android en el cambio de orientación
  • Bloquear la orientación del dispositivo - React Native (Android)
  • Cómo ajustar la página web al ancho de la webview cuando se cambia el tamaño de la vista web (sin recargar)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.