Abrufen von "DoStart starten, wenn bereits gestartet" im LoaderManager. Warum?

7

Mein Code enthält eine Aktivität mit einem FragmentPagerAdapter, der bei Bedarf 'n' Fragmente erstellt. Aktivität hat einen Loader und jedes Fragment hat seinen eigenen Loader. Alle Lader haben eine eindeutige ID. (Der Ladevorgang von Activity bestimmt tatsächlich die Anzahl der Seiten im Adapter)

Ich bekomme immer wieder diese Warnung und kann nicht sagen, was das verursacht. Es scheint nicht kritisch zu sein, auch wenn man den Code des LoaderManger betrachtet, der diese Warnung wirft, aber dennoch - Warnungen sind normalerweise Zeichen für Fehler.

Hatte ursprünglich FragmentStatePagerAdapter verwendet und dann zu FragmentPagerAdapter verschoben, wobei ich dachte, dass das irgendwie das Problem sein könnte - aber offensichtlich nicht.

Buchungscode würde dies wirklich komplizieren und sehr wenig hinzufügen.

Irgendwelche Gedanken?

    
JRun 28.01.2013, 10:02
quelle

2 Antworten

15

In Ihrem Fragment verschieben Sie Ihre initLoader-Methode innerhalb der onActivityCreated-Methode.

%Vor%     
mina 31.01.2013, 18:15
quelle
4

Ich habe gerade ein paar Stunden Debugging-Sitzung mit der Support-Bibliothek beendet.

TL; DR: KEIN getLoaderManager in Fragment.onCreate aufrufen, verwenden onActivityCreated !
(Dies bedeutet, dass Sie initLoader nicht vor onActivityCreated ausführen können)

Fragment.getLoaderManager() wird langsam eine LoaderManager -Instanz für Sie von der Aktivität erhalten. Damit dies jedoch gültig ist, muss das Fragment bereits aktiviert sein ( FragmentManager.makeActive ), was zwei wichtige Dinge impliziert:

  • das Fragment wurde hinzugefügt ( FragmentManager.addFragment )
  • Das Fragment hat eine interne Kennung ( mWho )
    ( makeActive ruft Fragment.setIndex auf)

Letzteres ist wirklich wichtig, denn wenn Sie Fragment.getLoaderManager() aufrufen, fragt wiederum FragmentActivity.getLoaderManager(who, ...) nach einem echten Manager. Beim Aufruf von Fragment.onCreate() ist der Aufruf makeActive noch nicht erfolgt, daher erhalten Sie eine LoaderManagerImpl mit mWho == null zurück, was schlecht ist, weil das Framework die LoaderManager Instanz jedem Fragment, das ähnlich ist, neu zuweist Lebenszyklus.

Aufgrund dieser Neuzuweisung wurde LoaderManager bereits von einem Fragment gestartet, aber ein anderes versucht es ebenfalls zu starten, da die Aktivität nicht wusste, welches Fragment fraglich ist, keines von beiden hatte ihre Identität ( mWho ) noch.

    
TWiStErRob 15.03.2015 01:40
quelle