In meiner App habe ich Fragment, das sich in ViewPager befindet. Fragment enthält RecyclerView mit einer Liste von Daten, die aus der Web-API basierend auf der Benutzerauswahl abgerufen werden.
Auf meinem Fragment onSaveInstanceState
speichere ich Listendaten nach Bunde, um die Daten über Konfigurationsänderungen usw. zu behalten.
Jetzt habe ich TransactionTooLargeException
in meinem App-Fehlerbericht angezeigt.
Es scheint, dass in einigen Fällen die Liste, die Im zu Bundle setzt, zu groß ist (da es sich um eine Sammlung ziemlich komplexer Objekte handelt).
Wie soll ich mit diesem Fall umgehen? Wie man meinen Fragmentstatus speichert (und wiederherstellt).
Ist es ok, setRetainInstance(true)
auf Fragmenten in ViewPager zu verwenden?
Um große Datenmengen zu erhalten, schlägt Google vor, es mit Fragment zu machen, das die Instanz behält. Idee ist, leeres Fragment ohne Ansicht mit allen notwendigen Feldern zu erstellen, die sonst in Bundle gespeichert wären. Hinzufügen von setRetainInstance (true) ; zur onCreate-Methode von Fragment. Und dann speichern Sie die Daten in Fragment on Activity onDestroy und laden sie onCreate. Hier ist ein Beispiel für Aktivität:
%Vor%Und Beispiel für Fragment:
%Vor% Wenn Ihr Fragment setRetainInstance(true)
nicht verwenden soll, können Sie Ihrer Aktivität ein leeres Fragment mit setRetainInstance(true)
hinzufügen. Dies ist nützlich, da untergeordnete Fragmente setRetainInstance(true)
nicht verwenden können.
Beispiel:
%Vor% Dann können Sie in Ihrem Fragment getActivity()
in Ihre Aktivitätsklasse eingeben und saveState(String, Object)
und getState(String)
verwenden, um Ihre Liste zu speichern.
Es gibt andere Diskussionen darüber, die an den folgenden Orten gefunden werden können:
Was tun bei TransactionTooLargeException
? android.os.TransactionTooLargeException auf Nougat (Akzeptierte Antwort schlägt setRetainInstance(true)
vor.)
setRetainInstance()
ist der beste Weg, um dies ohne Nebenwirkungen zu erreichen. Die Verwendung von static
führt zu einem Speicherverlust, und es ist nicht sinnvoll, den Status in onSaveInstanceState()
zu speichern und seither zurückzuerhalten, setRetainInstance()
erledigt dies für Sie.
Erstellen Sie also ein Feld für die Liste in der Fragment-Klasse und prüfen Sie immer auf null
oder size
der Liste, um mit dem Abrufen der neuesten Daten zu beginnen
Tags und Links android android-fragments exception