8

Ich verstehe dieses Fragmentlebenszyklusgeschäft nicht ganz.Warum wird mein onCreate-Fragment ausgiebig aufgerufen, wenn ich die Anwendungen viewPager durchblättere?

Ich habe eine ziemlich Standard 3 Seiten horizontale Slider Ansicht Pager Layout für eine "Details anzeigen" -Abschnitt meiner App. Ich starte meine App auf der mittleren Seite der drei. Meine FragmentActivity setzt die Seite auf Seite 1.e

mPager.setCurrentItem(1); //default to center page, current data view fragment 

Ich habe den FragmentStatePagerAdapter benutzen, weil mit Hilfe des FragmentPagerAdapter meine app manchmal abgestürzt, wenn der Artikel wieder aus einem aufgehängten Zustand zum Beispiel kommen, und dies der schnellste Weg war, Um das zu kümmern. Scheint zu funktionieren, aber ich vermute, dass der Staatsaspekt hier die Ursache meines Problems ist.

Also 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 nicht so sicher mehr.

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

Die Umstellung auf onCreate hat nichts geändert. OnCreate wird immer noch genauso aufgerufen wie onCreateView für die 2 benachbarten Fragmente.

Die seltsame Sache ist, dass das Fragment, das ich als erstes in Fragment Activity eingestellt habe, nur das onCreate aufgerufen bekommt.

Etwas fühlt sich hier nicht richtig an.

Im Moment denke ich, dass ich die Elternfragmentaktivität deklarieren und alle Async-Aufgaben aufrufen sollte, 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 verwenden Sie dann die Fragmente, um das Listenobjekt usw. zu erstellen.

Aber was, wenn die asynchronen Tasks vom übergeordneten Objekt gestartet werden Aktivität nicht beenden, bevor jedes Fragment onCreateView genannt wird und das Objekt von der Mutter enthalten ist noch nicht fertig .....

unterzeichnet, verwirrte und frustriert

Antwort

25

ViewPager ist sehr eifrig in Sachen heruntergefahren es verwendet derzeit nicht, 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, hat Seite 2 nur onCreate(..) einmal aufgerufen, weil es immer neben der aktuell ausgewählten Seite ist oder ist.

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

+0

oh ya, das klingt hilfreich zu versuchen. Also, hey, scheint das Abfeuern asynchroner Aufgaben von einem Fragment onCreate wie eine Standardmethode zu sein? Jetzt feuere ich drei separate Async-Aufgaben ab, sobald meine Fragmentaktivität geladen ist, richtig oder falsch .... – topwik

+0

Ja, das einzige Problem, das ich möglicherweise sehen könnte, ist, wenn ein Benutzer das Gerät dreht, wenn die AsyncTask ausgeführt wird. Ich habe jedoch nicht viel Erfahrung mit ihnen. Es könnte sich lohnen, die AsyncTaskLoader-Klasse zu testen. Ich glaube, dass die Loader-Klassen viele Dinge für Sie automatisieren. –

+0

Ich habe auch in dieser Ausgabe gefangen. Jetzt muss ich arbeiten. Danke vielmals. – Durai

2

@ Espiandevs Lösung wird für Ihren aktuellen Fall funktionieren, aber Sie haben Recht, dass Ihr Zustand das Problem ist. Sie sollten die und/oder onSaveInstanceState Methoden verwenden, um Ihre Fragment 's Zustand zu speichern (die nicht zu hart sein sollte, da z.Eine Antwort vom Server kann normalerweise als String dargestellt werden. Verwenden Sie dann getArgument und/oder Bundle, die in onCreate übergeben wurden, um sie wiederherzustellen.

Alternativ können Sie Ihre haben Activity tun der Server abruft, und dann setArgument für jede Ihrer Fragmente rufen, und überprüfen Sie die Argumente in Ihrem Fragment, um zu bestimmen, ob Ihre Daten noch angekommen ist (und wenn nicht, angezeigt werden möglicherweise eine Lade Zustand irgendeiner Art).

Wenn Sie sich überhaupt um Bildschirmausrichtung kümmern, this related question wird auch für Sie nützlich sein.

+0

danke, Mann. Ich schätze die Antwort. ich wollte weitermachen mit "was wäre, wenn ich noch mehr Fragmente in diesem Pager hätte" .... – topwik

Verwandte Themen