Unterschied zwischen FragmentPagerAdapter und FragmentStatePagerAdapter
Was ist der Unterschied zwischen FragmentPagerAdapter
und FragmentStatePagerAdapter
?
Über FragmentPagerAdapter
Google ' s guide sagt:
Diese version der pager ist am besten für den Einsatz, wenn es gibt eine Handvoll von
in der Regel eher statischen Fragmente werden seitenweise durch, wie eine Reihe von
tabs. Das fragment von jeder Seite, die der Benutzer besucht wird, gehalten werden.
Speicher, obwohl die view-Hierarchie zerstört werden kann, wenn Sie nicht sichtbar.
Dies kann dazu führen, eine große Menge an Speicher, da fragment
Instanzen zu halten, kann auf einer beliebigen Höhe der staatlichen. Für größere Mengen
von Seiten betrachten FragmentStatePagerAdapter.
Und über FragmentStatePagerAdapter
:
Diese version der pager ist mehr nützlich, wenn es gibt eine große Anzahl
Seiten, die mehr wie eine list-Ansicht. Wenn Seiten nicht angezeigt werden
die Benutzer, die Ihre gesamte fragment zerstört werden kann, nur, die
gespeicherten Zustand des Fragmentes. Dies erlaubt den pager zu halten, um viel
weniger Speicher im Zusammenhang mit jeder besuchten Seite im Vergleich zu
FragmentPagerAdapter auf Kosten der potentiell erhöhten Aufwands, wenn
das Umschalten zwischen Seiten.
Also ich habe nur 3 Fragmente. Aber alle von Ihnen ist ein separates Modul mit großer Menge von Daten.
Fragment1
behandelt einige Daten (die der Benutzer eingeben) und übergibt es über die Aktivität in Fragment2
das ist nur eine einfache ListFragment
. Fragment3
ist auch ein ListFragment
.
Also meine Fragen sind: Welches Netzteil sollte ich verwenden? FragmentPagerAdapter
oder FragmentStatePagerAdapter
?
InformationsquelleAutor der Frage AlexMomotov | 2013-09-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie die docs sagen, denken Sie an es auf diese Weise. Wenn eine Anwendung wie eine book-reader, die Sie nicht wollen, laden alle Fragmente gleichzeitig in den Speicher. Sie laden möchten, und zerstören
Fragments
als der Benutzer liest. In diesem Fall verwenden SieFragmentStatePagerAdapter
. Wenn Sie nur anzeigen von 3 "tabs", die nicht enthalten eine Menge von schweren Daten (wieBitmaps
), dannFragmentPagerAdapter
könnte gut zu Ihnen passen. Beachten Sie auch, dassViewPager
standardmäßig geladen werden, die 3 Fragmente in den Speicher. Die erstenAdapter
nennen könnte zerstörenView
Hierarchie und neu laden, wenn benötigt, die zweiteAdapter
speichert nur den Zustand derFragment
und zerstört es, wenn sich der Benutzer dann kommt diese Seite wieder der Staat abgerufen werden.InformationsquelleAutor der Antwort Emmanuel
FragmentPagerAdapter
speichert das ganze fragment in Erinnerung, und könnteerhöhen Speicher-overhead, wenn eine große Menge von Fragmenten verwendet werden
ViewPager
.Im Gegenteil Ihre Schwester
FragmentStatePagerAdapter
speichert nur dassavedInstanceState der Fragmente, und zerstört alle Fragmente, wenn
Sie den Fokus verlieren.
Daher
FragmentStatePagerAdapter
sollte verwendet werden, wenn wir zuverwenden Sie dynamische Fragmente, wie Fragmente mit widgets, wie Ihre Daten
gespeichert werden kann in der
savedInstanceState
.Auch wird es nicht auf die Leistung, auch wenn es eine große Anzahl vonFragmente.
Im Gegenteil seine Geschwister
FragmentPagerAdapter
sollte verwendet werden, wennwir speichern das gesamte fragment in den Arbeitsspeicher.
Wenn ich sage, die ganze fragment im Speicher gehalten, es bedeutet, seinen
Instanzen werden nicht zerstört und würde erstellen Sie eine Speicher-overhead.
Daher ist es ratsam, zu verwenden
FragmentPagerAdapter
nur, wenn essind die zu geringe Zahl der Fragmente für
ViewPager
.Wäre es sogar besser, wenn die Fragmente sind statische, denn Sie würde
nicht mit einer großen Menge von Objekten, deren Instanzen wären
gespeichert.
Mehr detail,
FragmentStatePagerAdapter:
mit
FragmentStatePagerAdapter
,nicht benötigte fragment istzerstört.Eine Transaktion vollständig zu entfernen
fragment von Ihrer Aktivität ist
FragmentManager
.Dem Staat, in
FragmentStatePagerAdapter
kommt von der Tatsache, dass eswird speichern Sie Ihre fragment
Bundle
aussavedInstanceState
wennes ist zerstört.Wenn der Benutzer zurück navigiert,wird das neue fragment wird
wieder mit der fragment-Zustand.
FragmentPagerAdapter:
Vergleich
FragmentPagerAdapter
tut nichts, der Art.Wenndas fragment ist nicht mehr erforderlich.
FragmentPagerAdapter
Aufrufedetach(Fragment)
auf die Transaktion stattremove(Fragment)
.Diese zu zerstören, ist das fragment Sicht, lässt aber die fragment-Instanz
am Leben in der
FragmentManager
.also die Fragmente erstellt, in derFragmentPagerAdapter
sind nie zerstört.InformationsquelleAutor der Antwort Naruto
Etwas, das nicht explizit gesagt wird, in der Dokumentation oder in den Antworten auf dieser Seite (obwohl implizit @Naruto), ist, dass
FragmentPagerAdapter
werden nicht aktualisiert, die Fragmente, wenn die Daten im Fragment verpasst, denn er hält das Fragment im Speicher.Also selbst wenn Sie haben eine begrenzte Anzahl von Fragmenten, die anzeigen, wenn Sie möchten in der Lage sein, zu aktualisieren Sie Ihre Fragmente (zum Beispiel sagen, Sie re-führen Sie die Abfrage zum aktualisieren der listView in der Fragment), die Sie verwenden müssen FragmentStatePagerAdapter.
Meine ganze Punkt hier ist, dass die Anzahl der Fragmente, und ob oder nicht Sie sind ähnlich, ist nicht immer der Schlüssel Aspekt zu berücksichtigen. Ob oder nicht, Ihre Fragmente sind dynamisch ist auch der Schlüssel.
InformationsquelleAutor der Antwort JDenais
FragmentPagerAdapter
speichert die vorherigen Daten, die holt man sich aus dem adapter währendFragmentStatePagerAdapter
nimmt den neuen Wert aus dem adapter jedes mal wenn es ausgeführt wird.InformationsquelleAutor der Antwort vinay kumar
Hier ist eine log-lifecycle von jedem fragment in
ViewPager
4-fragment-undoffscreenPageLimit = 1 (default value)
FragmentStatePagerAdapter
Gehen Fragment1 (Start-Aktivität)
Gehen Sie zu Fragment2
Gehen Fragment3
Gehen Fragment4
FragmentPagerAdapter
Gehen Fragment1 (Start-Aktivität)
Gehen Sie zu Fragment2
Gehen Fragment3
Gehen Fragment4
Abschluss:
FragmentStatePagerAdapter
nennenonDestroy
wenn das Fragment ist zu überwindenoffscreenPageLimit
währendFragmentPagerAdapter
nicht.Hinweis: ich denke, wir sollten Sie nutzen
FragmentStatePagerAdapter
für eineViewPager
die viel auf der Seite, weil es gut für die performance.Beispiel von
offscreenPageLimit
:Wenn wir gehen, um Fragment3, es wird detroy Fragment1 (oder Fragment5 wenn haben), weil
offscreenPageLimit = 1
. Wenn wiroffscreenPageLimit > 1
es nicht zerstören.Wenn in diesem Beispiel setzen wir
offscreenPageLimit=4
gibt es keinen Unterschied zwischen der VerwendungFragmentStatePagerAdapter
oderFragmentPagerAdapter
da Fragment nie rufenonDestroyView
undonDestroy
wenn wir ändern RegisterkarteGithub demo hier
InformationsquelleAutor der Antwort Phan Van Linh
FragmentStatePagerAdapter = Für eine große Anzahl von Fragmenten, die im ViewPager. Da dieser adapter zerstört das fragment, wenn es für den Benutzer nicht sichtbar und nur savedInstanceState des fragments wird gehalten für die weitere Verwendung. Diese Weise eine geringe Menge an Arbeitsspeicher verwendet wird, und eine bessere Leistung geliefert wird im Fall der dynamischen Fragmente.
InformationsquelleAutor der Antwort Dwivedi Ji