2011-10-18 19 views
10

Tengo una actividad que llama a initLoader cuando se crea para cargar los datos que se mostrarán en la actividad. Normalmente, esto funciona bien. Tengo puntos de interrupción establecidos para ver el orden en que ocurre todo. Primero llamo a initLoader, luego obtengo la devolución de llamada de OnCreateLoader, luego la devolución de llamada de OnLoadFinished, luego todo es genial.A veces no obtengo la devolución de llamada de CreateLoader después de llamar a initLoader

Sin embargo, noté que si cambiaba la orientación en mi Android no obtengo la devolución de llamada OnCreateLoader o la devolución de llamada OnLoadFinished, lo que no da como resultado que se muestren datos 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 ningún error y no encuentro ninguna documentación que explique por qué no recibiría una devolución de llamada después de llamar a initLoader.

Curiosamente, obtengo las devoluciones de llamada si regreso a la orientación original.

tanto, para resumir:

comienzo a la actividad en orientación vertical

  • llamo initLoader
  • que recibo onCreateLoader y onLoadFinished devoluciones de llamada

Entonces cambio de paisaje

  • me llaman initLoader
  • sin onCreateLoader o devoluciones de llamada onLoadFinished

puedo cambiar de nuevo a retrato

  • llamo initLoader
  • consigo onCreateLoader y onLoadFinished devoluciones de llamada

Del mismo modo, si comienzo la actividad en modo paisaje obtengo las devoluciones de llamada. Entonces, si cambio a retrato, no lo hago. Luego, si cambio de nuevo al paisaje obtengo las devoluciones de llamadas nuevamente.

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

Respuesta

2

He estado rastreando este problema

inicial crear (OnActivityCreated)

initLoader -> OnCreateLoader -> OnOnStartLoading -> OnLoadFinished

Orientación Chan ge - OnActivityCreated llamado nuevamente

initLoader - OnLoadFinished (¡Sin cargar ningún dato!) - error.

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

Lo que parece estar sucediendo es el código initLoader está escrito para asumir el fragmento no se destruye durante un cambio de orientación, lo que por supuesto no es la forma en que el resto de las obras androide ..

+2

así es como su ment para trabajar. Si llama a init en un cargador que ya ha cargado sus datos, simplemente devolverá esos datos a través de onLoadFinished. Debería consultar http://developer.android.com/reference/android/app/LoaderManager.html#restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks ) para volver a cargar los datos – Dori

9

Tenemos visto este mismo problema con Fragmentos en un ViewPager. Parece que los cargadores no se activan nuevamente cuando se reanuda un fragmento. De hecho, cuando el fragmento está en pausa, nuestro CursorLoader ya no recibe devoluciones de ContentObserver como era de esperar.

Nuestra solución ha sido llamar a restartLoader() el cual vuelca los contenidos anteriores y vuelve a cargar los datos. Esto tendría el mismo efecto neto que destroyLoader(); initLoader(), pero será más eficiente.

+2

Me encanta ¡¡tu hombre!! He estado criticando este problema durante horas, me has ahorrado muchos nervios. – user2758776

1

Tuve algo muy similar sucediendo con los adaptadores de cursor en fragmentos en el cambio de orientación. Se invocó initloader enCreateView (también se intentó onStart y onResume) pero nunca se invocó a OnCreatLoader ni a los demás métodos de devolución de llamada del cargador. También es de notar que en mi caso el fragmento estaba contenido en un buscapersonas.

Así que inicialmente se crearon la actividad y la vista del localizador y se crearon fragmentos y todo funcionó. El cambio de orientación a pesar de que las listas en mis fragmentos no obtendrían datos. Cambiando la orientación nuevamente y los datos regresaron.

En mi caso, la solución estaba cambiando esto:

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

lo cambié a este

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

pasé semanas en el seguimiento de este asunto. Me cansé de poner el contenido del fragmento anterior en mi nuevo fragmento. Finalmente arreglado.

En mi método onCreate() de los cuales fragmento implementado LoaderManager, lo hice

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

Funciona cuando el nuevo cargador no se actived correctamente.

0

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

me pareció que era simplemente basta con sólo hacer:

Loader<Cursor> loader = getActivity().getLoaderManager().getLoader(LOADERID); 

    if (loader == null) { 
     getActivity().getLoaderManager().initLoader(LOADERID, null, this); 
    } else { 
     getActivity().getLoaderManager().restartLoader(LOADERID, null, this); 
    } 
Cuestiones relacionadas