Warum wird mein onCreate-Fragment ausgiebig aufgerufen, wenn ich den viewPager meiner Anwendungen durchblättere?

8

Ich verstehe dieses Fragmentlebenszyklusgeschäft nicht ganz.

Ich habe ein ziemlich normales 3-seitiges horizontales Slider-Pager-Layout für einen "Details anzeigen" -Abschnitt meiner App. Ich starte meine App auf der mittleren Seite der drei. My FragmentActivity legt die Seite auf Seite 1 fest.

%Vor%

Ich habe den FragmentStatePagerAdapter verwendet, weil die Verwendung des FragmentPagerAdapters meine App zeitweise abgestürzt ist, wenn ich zum Beispiel aus einem suspendierten Zustand zurückgekehrt bin, und dies war der schnellste Weg, um das jetzt zu umgehen. Scheint zu funktionieren, aber ich vermute, dass der Staatsaspekt hier die Ursache für mein Problem sein könnte.

Zuerst dachte ich, dass ich jedes Fragment die Arbeit machen würde, Daten von einem Restdienst zu bekommen und es dann in einer Liste zu zeigen, aber ich bin mir nicht mehr so ​​sicher.

Ich habe versucht, eine eindeutige asynchrone Task auszuführen, um Daten in jedem der Fragmente von CreateView-Ereignissen abzurufen. Dann, nachdem ich mehr über den Fragment-Lebenszyklus gelesen hatte, wechselte ich zu onCreate, nachdem ich festgestellt hatte, dass das onCreateView ziemlich stark aufgerufen wurde, was wiederum für eine gierige App sorgte, die zu oft Daten über die Leitung anforderte.

Das Wechseln zu onCreate hat nichts geändert. OnCreate wird immer noch genauso aufgerufen wie onCreateView für die 2 benachbarten Fragmente.

Das Seltsame ist, dass das Fragment, das ich als erstes in Fragment Activity anwähle, nur einmal als onCreate aufgerufen wird.

Etwas fühlt sich hier nicht richtig an.

Im Moment denke ich, dass ich die Elternfragmentaktivität deklarieren und alle asynchronen Aufgaben aufrufen soll, um die Daten zu holen, die ich in den Fragmenten anzeigen muss. Legen Sie die Ergebnisse der asynchronen Aufrufe in einem Objekt fest, das der übergeordneten Fragmentaktivität gehört, und lassen Sie dann die Fragmente das Objekt verwenden, das vom übergeordneten Element zum Erstellen der Listenansicht usw. verwendet wird.

Was aber, wenn die asynchronen Tasks, die von der übergeordneten Aktivität gestartet wurden, nicht beendet werden, bevor jedes onCreateView-Fragment aufgerufen wird und das vom übergeordneten Element enthaltene Objekt noch nicht fertig ist ...

unterzeichnet, verwirrt und frustriert

    
topwik 07.08.2012, 19:17
quelle

2 Antworten

25

ViewPager ist sehr eifrig darin, Dinge herunterzufahren, die es gerade nicht benutzt, und genau das passiert hier. Das Standardverhalten besteht darin, dass ViewPager eine Seite auf jeder Seite der angezeigten Seite "behält" und den Rest zerstört. Daher wird Seite 3 in Ihrer 3-seitigen Ansicht zerstört, wenn Seite 1 ausgewählt wird, und wenn Seite 2 erneut ausgewählt wird, wird Seite 3 neu erstellt. Wie Sie bemerkt haben, wird auf Seite 2 nur onCreate(..) einmal aufgerufen, weil sie immer neben der aktuell ausgewählten Seite liegt.

Um dies zu lösen, setzen Sie einfach ViewPager.setOffscreenPageLimit(2) . Dann behält der ViewPager alle Ihre Fragmente. Offensichtlich ist dies keine gute Idee für eine große Anzahl von Fragmenten, aber für Ihren Fall sollte es in Ordnung sein.

    
Alex Curran 07.08.2012, 19:24
quelle
2

@ Espiandevs Lösung wird für Ihren aktuellen Fall funktionieren, aber Sie haben Recht, dass Ihr Zustand das Problem ist. Sie sollten die Methoden setArgument und / oder onSaveInstanceState verwenden, um den Zustand Fragment zu speichern (was nicht zu schwer sein sollte, da z. B. eine Antwort vom Server normalerweise als String dargestellt werden kann), und Verwenden Sie dann getArgument und / oder Bundle in onCreate , um es wiederherzustellen.

Alternativ können Sie Ihre Activity die Serverabrufe durchführen lassen und dann setArgument für jedes Ihrer Fragmente aufrufen und die Argumente innerhalb Ihres Fragment prüfen, um festzustellen, ob Ihre Daten bereits angekommen sind (und wenn nicht , möglicherweise einen Ladezustand irgendeiner Art anzeigen).

Wenn Sie sich überhaupt für die Änderung der Bildschirmausrichtung interessieren, diese verwandte Frage wird auch für Sie nützlich sein.

    
Jon O 07.08.2012 20:56
quelle