LoaderCallbacks.onLoadFinished nicht aufgerufen, wenn die Ausrichtung zu ändern passiert während AsyncTaskLoader laufen
Verwenden android-support-v4.jar und FragmentActivity (keine Fragmente an dieser Stelle)
Ich habe eine AsyncTaskLoader die ich starten laden und dann die Ausrichtung ändern, während der hintergrund-thread noch läuft. In meinen logs sehe ich die Antworten kommen durch den hintergrund, Anforderungen. Die Antworten komplett und ich erwarte, dass onLoadFinished() aufgerufen werden, aber das ist es nie.
Als ein Mittel der Problemlösung, in der Manifest-Datei, wenn ich android:configChanges="orientation" onLoadFinished() aufgerufen wird, wie erwartet.
Meine Aktivität implementiert die loader-Rückrufe. In der Quelle für die LoaderManager.initLoader() ich sehe, dass wenn der Lader schon vorhanden ist, wird der neue Rückruf ist auf das LoaderInfo-innere Objekt der Klasse, aber ich sehe nicht, wo Loader.registerListener() erneut aufgerufen wird. registerListener scheint nur aufgerufen werden, wenn LoaderManagerImpl.createAndInstallLoader() aufgerufen wird.
Ich vermute, dass da die Aktivität zerstört wird und neu erzeugt Ausrichtung ändern und da ist es der Hörer, der für Rückrufe, die neue Tätigkeit ist nicht registriert um benachrichtigt zu werden.
Kann das jemand bestätigen mein Verständnis und was die Lösung so, dass onLoadFinished ist genannt nach der Ausrichtung ändern?
- Als ein weiterer Schritt zur Fehlerbehebung, ich habe eine UI-weniger Arbeiter Fragment und setRetainInstance zu wahren. Das Fragment setzt die LoaderCallbacks. Das Fragment aufbewahrt wird zwischen Orientierung ändert aber seine onLoadFinished() wird niemals aufgerufen, nach Orientierung ändern.
- Wo ruft Ihr
initLoader()
? Stellen Sie sicher, dass es inonCreate()
. BTW, können SieLoaderManager.enableDebugLogging(true)
um einige debug-Informationen über den loader-Lebenszyklus (im logcat).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nikolaj identifiziert das Problem - vielen Dank.
Ich rief initLoader fron onResume(). Die Android-Dokumentation besagt:
Lesen "in der Regel", da ein bisschen mehr betonten, als ich es Tat, wenn es um den Umgang mit der Konfiguration ändern Lebenszyklus.
Zog ich meine initLoader Aufruf von onCreate() und, dass mein problem gelöst.
Ich denke der Grund dafür ist, dass in FragmentActivity.onCreate() eine Sammlung von LoaderManagers ist gezogen aus LastNonConfigurationInstance und in FragmentActivity.onStart() gibt es einige start-up-Arbeit in Bezug auf die Lader und LoaderManagers. Die Dinge sind bereits in der Entwicklung durch die Zeit, die onResume() aufgerufen wird. Wenn der Lader muss instanziiert zum ersten mal aufrufen initLoader von außen onCreate() noch funktioniert.
Es ist eigentlich nicht der Aufruf
initLoader()
imonCreate()
ist es zu beheben. Es ist der Aufruf zugetLoaderManager()
. In Zusammenfassung, was passiert ist, dass, wenn eine Aktivität neu gestartet wird, ist es bereits kennt, der Radlader. Versucht er neu zu starten, wenn Sie Ihre Tätigkeit zuvoronStart()
, aber dann trifft es Sie diesen code inFragmentHostCallback.doLoaderStart()
*:Seit getLoaderManager() wurde nicht aufgerufen, doch
mLoaderManager
null ist. Daher überspringt die erste Bedingung, und der Aufruf vonmLoaderManager.doStart()
.Testen Sie dies einfach, indem ich einen Aufruf
getLoaderManager()
imonCreate()
. Sie brauchen nicht zu rufen init /Neustart-Lader gibt.Dieser scheint wirklich ein bug zu mir.
* Dies ist der code Weg, auch wenn Sie nicht mit Fragmenten, also bitte nicht verwirren.