2010-11-26 13 views
32

Soweit ich onRetainNonConfigurationInstance sehe, ist ein redundanter Rückruf. Wenn meine Aktivität eine sehr teure Initialisierung hat, ist es besser, onSaveInstanceState zu verwenden. Gespeicherte Instanz umfasst mehr Situationen als Nicht-Konfigurationsinstanz. Gibt es eine Richtlinie für die Verwendung einer API gegenüber der anderen? Vielen Dank.Welcher zu verwenden: onSaveInstanceState vs onRetainNonConfigurationInstance?

Antwort

45

Soweit ich onRetainNonConfigurationInstance sehen kann, ist ein redundanter Rückruf.

Nein, ist es nicht.

Wenn meine Aktivität wirklich teuer Initialisierung hat, bin ich besser mit onSaveInstanceState.

onSaveInstanceState() ist nicht für "wirklich teure Initialisierung" ausgelegt. Es wurde für "Hey, der Benutzer hat einige Änderungen an den Informationen in der Aktivität gemacht, aber hat es noch nicht gespeichert, lass uns diese Daten nicht verlieren, m'kay?".

Gibt es eine Richtlinie für die Verwendung einer API gegenüber der anderen?

Wenn es in eine Bundle passt und nicht zu groß ist, verwenden Sie onSaveInstanceState(). Alles, was nicht in eine Bundle (z. B. eine Buchse) passt oder wirklich groß ist (z. B. ein Foto als Bitmap), sollte onRetainNonConfigurationInstance() verwenden, und Ihre Anwendung sollte in der Lage sein, diese Elemente bei Bedarf neu zu erstellen.

+6

@Raj: Nein, würde es nicht. Die beiden Methoden dienen unterschiedlichen Rollen. 'onSaveInstanceState()' wird in Konfigurationsänderungen verwendet. Es wird auch in Fällen verwendet, in denen Android den Prozess der Anwendung zum Freigeben von RAM beenden möchte, der Benutzer jedoch immer noch zu der Aktivität zurückkehren kann (z. B. über die Schaltfläche ZURÜCK). Aus diesem Grund verwendet Android ein 'Bundle' - es kann in ein' byte [] 'umgewandelt und über Prozessgrenzen hinweg versendet werden. Android hält das 'byte []' so lange fest, bis es benötigt wird oder bis die Aktivität nicht mehr über BACK erreichbar ist. – CommonsWare

+6

@Raj: Da jedoch ein 'Bundle' (oder was auch immer' onSaveInstanceState() 'verwenden würde) über Prozessgrenzen hinweg transportiert werden muss, gibt es immer noch keine Möglichkeiten, mit Dingen umzugehen, die wir für eine Konfigurationsänderung behalten wollen, aber nicht selbst gehe in ein 'Bündel', wie eine Steckdose. Dafür gibt es 'onRetainNonConfigurationInstance()', das nur in Fällen verwendet wird, in denen der Prozess * nicht * beendet wird, und so können wir beliebige Objekte von der alten zur neuen Aktivitätsinstanz übergeben. – CommonsWare

+3

Mein Take ist, OnSaveInstanceState() ermöglicht das Speichern von einfach serialisierbaren Daten in Langzeit-Speicher. Diese Daten können zu einem späteren Zeitpunkt abgerufen werden, auch nachdem die Anwendungsprozesse beendet wurden. Im Gegensatz dazu können Sie mit onRetainNonConfigurationInstance() jedes Java-Objekt mit der Annahme speichern, dass diese Objekte sofort von einer neuen Aktivitätsinstanz wiederverwendet werden. Daher können Elemente wie AsyncTask und SQLiteDatabase gespeichert werden. Der Schlüssel besteht darin, diese Objekte über den Kontext der Anwendung und nicht über die Aktivität zu erstellen. Andernfalls kann die zerstörte Aktivität möglicherweise nicht als Müll gesammelt werden. – Raj

Verwandte Themen