2011-10-18 10 views
10

Mam działanie, które wywołuje funkcję initLoader po jej utworzeniu w celu załadowania danych wyświetlanych w działaniu. Normalnie działa to dobrze. Mam punkty przerwania, aby zobaczyć kolejność, w której wszystko się dzieje. Najpierw wywołuje funkcję initLoader, a następnie wywołania zwrotnego OnCreateLoader, a następnie wywołania zwrotnego OnLoadFinished, a następnie wszystko jest świetne.Czasami nie można uzyskać połączenia zwrotnegoCreateLoader po wywołaniu funkcji initLoader

Zauważyłem jednak, że jeśli zmieniłem orientację na moim systemie Android, to nie otrzymam oddzwaniania OnCreateLoader lub wywołania zwrotnego OnLoadFinished, co spowoduje brak danych wyświetlanych na stronie. Nadal dostaję mój breakpoint na wywołanie initLoader, więc wiem, że to się dzieje, ale nie dostaję błędu i nie mogę znaleźć żadnej dokumentacji wyjaśniającej, dlaczego nie otrzymam wywołania zwrotnego po wywołaniu initLoader.

Co ciekawe, otrzymuję wywołania zwrotne, jeśli powrócę do oryginalnej orientacji.

Tak więc, aby podsumować:

rozpocząć działalność w orientacji pionowej

  • Wzywam initLoader
  • dostaję onCreateLoader i onLoadFinished callbacków

I następnie zmiana krajobrazu

  • Wzywam initLoader
  • nie onCreateLoader lub onLoadFinished callbacks

zmienić z powrotem do portretu

  • Wzywam initLoader
  • uzyskać onCreateLoader i onLoadFinished callbacków

Podobnie, jeśli uruchomię aktywność w trybie poziomym, otrzymam wywołania zwrotne. Potem, jeśli przejdę do portretu, nie. Następnie, jeśli przełączę się z powrotem w krajobraz, otrzymuję ponownie wywołania zwrotne.

Czy ktoś ma pojęcie, co się dzieje?

Odpowiedz

2

Byłem śledzenie tego problemu

Początkowa tworzyć (OnActivityCreated)

initLoader -> OnCreateLoader -> OnOnStartLoading -> OnLoadFinished

Orientacja chan ge - OnActivityCreated ponownie wywoływany

initLoader - OnLoadFinished (bez ładowania żadnych danych!) - błąd.

Jedyne obejście, które znalazłem, to wywołanie metody destroyLoader() tuż przed init. Zmusza to odpowiednią sekwencję tworzenia/uruchamiania/ukończenia.

Co wydaje się dzieje jest kod initLoader napisano zakładać fragment nie jest zniszczony podczas zmiany orientacji, co nie jest oczywiście jak reszta utworów android ..

+2

ten sposób jego ment do pracy. Jeśli wywołanie init w programie ładującym, który już załadował swoje dane, po prostu zwróci te dane przez onLoadFinished. Powinieneś spojrzeć na http://developer.android.com/reference/android/app/LoaderManager.html#restartLoader(int, android.os.Bundle, android.app.LoaderManager.LoaderCallbacks ), aby przeładować dane. – Dori

9

Mamy widziałem ten sam problem z Fragments w ViewPager. Wygląda na to, że ładowarki nie są ponownie aktywowane ponownie po wznowieniu fragmentu. W rzeczywistości, gdy fragment zostanie zatrzymany, nasz CursorLoader nie będzie już otrzymywać wywołań ContentObserver, tak jak oczekiwałbym.

Nasze obejście polegało na wywołaniu metody restartLoader(), która zrzuca poprzednią zawartość i ponownie ładuje dane. Miałoby to taki sam wpływ na sieć jak destroyLoader(); initLoader(), ale będzie bardziej wydajny.

+2

Uwielbiam ty człowieku!! Od wielu godzin walę z tym problemem, oszczędziłeś mi nerwów. – user2758776

1

Miałem coś bardzo podobnego, dzieje się z adapterami kursora we fragmentach na temat zmiany orientacji. initloader został wywołany onCreateView (również wypróbowany onStart i onResume), ale metoda onCreatLoader oraz inne metody wywołania zwrotnego nigdy nie zostały wywołane. Również w moim przypadku fragment był zawarty w pager widoku.

Początkowo działka i widok stron i fragmenty zostały utworzone i wszystko działało. Podczas zmiany orientacji listy w moich fragmentach nie otrzymają danych. Ponowna zmiana orientacji i dane powróciły.

W moim przypadku poprawka została zmieniając w ten sposób:

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

Zmieniłem go do tej

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

spędziłem tydzień na śledzenie tego problemu. Zmęczyło to umieszczenie zawartości poprzedniego fragmentu w moim nowym fragmencie. Naprawiono.

W mojej metody onCreate(), której fragment realizowanego LoaderManager, zrobiłem to

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

To działa, gdy nowa ładowarka nie została prawidłowo actived.

0

Ostatnio miałem ten problem i chciałbym przesłać moje rozwiązanie.

znalazłem to wystarczyło po prostu po prostu zrobić:

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

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