2016-04-27 9 views
2

Ich habe ein Fragment ein onCreateView Ich mache einen Hintergrund asyn-Aufruf, um einige Daten zur Anzeige zu holen.
Ich speichere das Objekt, das das Ergebnis des Hintergrundaufrufs ist, als eine Membervariable des Fragments.
Wenn ich die Benutzeroberfläche und die Daten sehe, ist alles in Ordnung und wenn ich die Home-Taste drücke, geht die App zum Hintergrund. Wenn ich die App erneut öffne, sind die Daten in der Benutzeroberfläche von meinem Fragment aufgebläht.
So jetzt bin ich mir nicht sicher über die folgenden:
1) Sollte ich mein Objekt in der onSaveInstanceState speichern?
2) Wo soll ich es wiederherstellen? In dem Bündel in der onCreateView übergeben?
3) Wann werden die Daten in meinem Bundle gespeichert? Ich meine, wie kann ich das sehen, ohne es jetzt zu speichern, würde ich die Daten von meinem UI verlieren?Korrekte Verwendung des Instanzstatus von Fragmenten speichern

Antwort

1

In Ihrem Fragment Konstruktor, fügen Sie die folgende Zeile:

setRetainInstance(true); 

Kontrolle, ob ein Fragment Instanz über Aktivität beibehalten wird Neuschöpfung (wie aus einer Konfigurationsänderung).

+0

So kann ich im Paket für den onSaveInstanceState speichern, aber ich kann das nicht verwenden? – Jim

0

Es hängt von Ihren Daten (Größe) ab.

Möchten Sie ein Fragment auf dem Backstack haben (mit beibehaltenem Fragment können Sie nicht)?

Für "Home-Button-Aktion" und nicht beibehalten Fragment implementieren Parcelable-Schnittstelle und verwenden Sie onSaveInstanceState() zu speichern und onCreateView()/onCreate(), um Daten aus einem Bundle wiederherzustellen.

Achten Sie auf die Schaltfläche "Zurück", um Ihre Daten zu verlieren.

+0

Wenn ich die Home-Taste drücke und die App öffne, wird die 'onCreateView' nicht aufgerufen – Jim

+0

Das funktioniert so mit setRetainInstance (true), onCreate() wird noch aufgerufen. Und wenn Sie beibehaltenes Fragment verwenden, warum möchten Sie überhaupt Daten speichern? –

0

auch wie eine Aktivität können Sie den Zustand eines Fragments behalten eine Bundle verwenden, falls der Prozess Aktivität getötet wird, und Sie müssen das Fragment Zustand wiederherzustellen, wenn die Aktivität neu erstellt wird. Sie können den Zustand während des onSaveInstanceState() - Callbacks des Fragments speichern und es entweder onCreate(), onCreateView() oder onActivityCreated() wiederherstellen. Weitere Informationen zum Speichern des Status finden Sie im Dokument Aktivitäten .

Es scheint, dass Ihr Fragment in Ordnung ist, indem es die Daten jedes Mal abruft, wenn es angezeigt wird.

Wenn Sie die Daten speichern möchten, um das asynchrone Abrufen zu vermeiden, können Sie onSaveInstanceState verwenden. Dazu müssen Sie Ihre Daten unter Verwendung einer Bundle speichern.

dann in onCreateView überprüfen, ob savedInstanceState ist null und wenn es nicht von der Asynchron holen, sonst erstellen Sie Daten aus dem savedInstanceStateBundle.

Verwandte Themen