So entfernen Sie das beibehaltene Instanzfragment ordnungsgemäß

8

Momentan möchte ich bei Konfigurationsänderungen eine teure Datenstruktur beibehalten. Ich entscheide mich dafür, Bundle nicht zu verwenden, da die teure Datenstruktur nicht parzellierbar ist.

Daher verwende ich ein Nicht-UI-Fragment (genannt RetainInstanceFragment ), dessen setRetainInstance(true) die Datenstruktur enthält.

%Vor%

Ein UI-Fragment (genannt UIFragment ) erhält die teure Datenstruktur von RetainInstanceFragment . Immer wenn Konfigurationsänderungen an UIFragment vorgenommen werden, versucht UIFragment immer, das "im Cache gespeicherte" RetainInstanceFragment von FragmentManager zu erhalten, bevor es beschließt, ein neues RetainInstanceFragment zu erstellen.

Beispielcode ist wie folgt.

%Vor%

Allerdings gibt es ein Problem. Immer wenn ich mein altes UIFragment zerstöre und es durch neues UIFragment ersetze, Ich erwarte, dass auch altes RetainInstanceFragment zerstört wird. So zerstöre ich und erstelle neues UIFragment

%Vor%

Aber das alte RetainInstanceFragment wird niemals zerstört.

Ich vermute, vielleicht vergesse ich, in UIFragment aufzuräumen. Daher füge ich den folgenden Code hinzu

UIFragment

%Vor%

Es funktioniert jedoch nicht die ganze Zeit. Ich führe mehrere gleitende Menüklicks aus.

%Vor%

Irgendeine Idee, wie ich zurückgehaltenes Instanzfragment richtig entfernen kann?

    
Cheok Yan Cheng 22.03.2013, 07:59
quelle

2 Antworten

6

Wie von @Luksprog vorgeschlagen, funktioniert die folgende Methode. Es erklärt jedoch immer noch nicht, warum die vorherige Bereinigung durch onDetach nicht funktioniert hat. Wenn jemand erklären kann, warum diese Lösung funktioniert und vorherige nicht, wäre ich sehr dankbar. :)

UIFragment

%Vor%

MyFragmentActivity

%Vor%

(Bearbeitet) Nützlicher Kommentar von @Luksprog

  

Die Fragmenttransaktionen werden nicht sofort ausgeführt. Meine Annahme war   Die Ausführung dieser Transaktion im onDetach () - Callback wird nicht entfernt   Die Retain-Fragment-Instanz vor dem Ersetzen des UI-Fragments   Die Transaktion ist abgeschlossen und das neue UI-Fragment wird weiterhin angezeigt   Behalte Fragment-Instanz noch verfügbar, so dass keine neue Instanz erstellt wird   ein. Deine vorherige Methode ist nicht im Geiste der Fragmente   Rahmen, in dem Fragmente anderer Fragmente und der   Aktivität verwaltet alle von ihnen, da es mehr über das Ganze weiß   Anwendungsstatus.

    
Cheok Yan Cheng 22.03.2013, 09:28
quelle
0

Ich denke, Sie können das Fragment einfach aus der Fragmenttransaktion entfernen.

%Vor%     
Richard LIANG 20.05.2015 07:38
quelle

Tags und Links