2011-10-18 8 views
10

Ho un'attività che chiama initLoader quando viene creata per caricare i dati che l'attività mostrerà. Normalmente, questo funziona bene. Ho dei punti di interruzione per vedere l'ordine che tutto accada. Prima chiamo initLoader, poi ottengo il callback OnCreateLoader, quindi il callback OnLoadFinished, quindi tutto è ottimo.A volte non si attiva la richiamataCreateLoader dopo aver chiamato initLoader

Tuttavia, ho notato che se ho cambiato l'orientamento sul mio Android che non ottengo il callback OnCreateLoader o il callback OnLoadFinished, con conseguente nessun dato visualizzato sulla pagina. Ricevo ancora il mio breakpoint sulla chiamata di initLoader, quindi so che sta succedendo, ma non ricevo un errore e non riesco a trovare alcuna documentazione che spieghi perché non riceverei una richiamata dopo aver chiamato initLoader.

È interessante notare che, se ritorno all'orientamento originale, ottengo i callback.

Quindi, per riassumere:

comincio l'attività in orientamento verticale

  • chiamo initLoader
  • ottengo onCreateLoader e onLoadFinished callback

ho poi cambiare paesaggio

    .210
  • Chiamo initLoader
  • non onCreateLoader o callback onLoadFinished

cambio di nuovo al ritratto

  • chiamo initLoader
  • ottengo onCreateLoader e onLoadFinished callback

Allo stesso modo, se avvio l'attività in modalità orizzontale ottengo i callback. Quindi, se passo al ritratto, non lo faccio. Quindi, se torno al panorama, ricevo di nuovo i callback.

Qualcuno ha idea di cosa sta succedendo?

risposta

2

Sto tracciando questo problema

iniziale creare (OnActivityCreated)

initLoader -> OnCreateLoader -> OnOnStartLoading -> OnLoadFinished

Orientamento chan ge - OnActivityCreated chiamato di nuovo

initLoader - OnLoadFinished (Senza caricare alcun dato!) - bug.

L'unica soluzione che ho trovato è chiamare destroyLoader() appena prima dell'iniz. Ciò impone che venga eseguita la sequenza corretta Crea/Avvia/Fine.

Quello che sembra essere accadendo è il codice initLoader viene scritto ad assumere il frammento non viene distrutto durante un cambio di orientamento, che è, naturalmente, non come il resto delle opere Android ..

+2

questo è come il suo mento a lavorare. Se si chiama init su un loader che ha già caricato i suoi dati, restituirà tali dati tramite onLoadFinished. Si dovrebbe guardare http://developer.android.com/reference/android/app/LoaderManager.html#restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks ) per ricaricare i dati – Dori

9

Abbiamo visto lo stesso problema con Fragments in un ViewPager. Sembra che i caricatori non vengano correttamente attivati ​​di nuovo quando viene ripreso un frammento. Infatti, quando il frammento viene messo in pausa, il nostro CursorLoader non riceve più i callback di ContentObserver come mi aspetterei.

La nostra soluzione è stata quella di chiamare restartLoader() che scarica i contenuti precedenti e ricarica i dati. Questo avrebbe lo stesso effetto netto di destroyLoader(); initLoader(), ma sarà più efficiente.

+2

I love tu uomo!! Mi stavo rompendo la testa per ore e ore, mi hai risparmiato un sacco di nervi. – user2758776

1

Ho avuto qualcosa di molto simile a ciò che accade con gli adattatori del cursore in frammenti sul cambio di orientamento. initloader è stato chiamato in onCreateView (anche provato onStart e onResume) ma onCreatLoader e gli altri metodi di callback del loader non sono mai stati richiamati. Inoltre, nel mio caso il frammento era contenuto in un cercapersone.

Quindi inizialmente l'attività e la visualizzazione di cercapersone e frammenti sono stati creati e tutto ha funzionato. In caso di modifica dell'orientamento, le liste dei miei frammenti non otterrebbero dati. Cambiando di nuovo l'orientamento, i dati tornano.

Nel mio caso la correzione è stata cambiando questo:

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

ho cambiato in questo

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

Ho passato settimane sul monitoraggio questo tema. È stanco di inserire il contenuto del frammento precedente nel mio nuovo frammento. Finalmente riparato.

Nel mio metodo onCreate() di cui frammento implementato LoaderManager, ho fatto questo

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

Funziona quando nuova pala non era actived correttamente.

0

Ho avuto questo problema di recente e vorrei presentare la mia soluzione.

ho scoperto che era abbastanza semplice per fare proprio:

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

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