510 Stimmen

Was ist der Unterschied zwischen commit() und apply() in SharedPreferences

Ich verwende SharedPreferences in meiner Android-App. Ich verwende beides commit() y apply() Methode aus der gemeinsamen Präferenz. Wenn ich AVD 2.3 verwende, wird kein Fehler angezeigt, aber wenn ich den Code in AVD 2.1 ausführe, apply() Methode zeigt einen Fehler.

Was ist also der Unterschied zwischen diesen beiden? Und indem man nur commit() Kann ich den Präferenzwert problemlos speichern?

132 Stimmen

Dieser Artikel ist zwar schon ein Jahr alt, aber ich werde ihn trotzdem kommentieren, auch wenn es offensichtlich ist, dass keine der Antworten diesen Punkt trifft: apply() führt asynchron Festplatten-E/A durch, während commit() ist synchron. Sie sollten also wirklich nicht commit() aus dem UI-Thread.

0 Stimmen

Wenn mehrere SharedPreferences.Editor-Objekte in Gebrauch sind, wird das letzte Objekt, das die apply() gewinnt. Daher können Sie apply() anstelle von commit() sicher, wenn Sie sicherstellen, dass nur ein SharedPreferences.Editor von Ihrer Anwendung verwendet wird.

2 Stimmen

Gemäß der Lint-Warnung von Android Studio: commit() speichert Daten sofort und synchron. Mit apply() werden die Daten jedoch asynchron (im Hintergrund) gespeichert, wodurch sich die Leistung etwas verbessert. Deshalb ist apply() gegenüber commit() vorzuziehen, wenn man sich nicht um den Rückgabetyp kümmert (ob die Daten erfolgreich gespeichert wurden oder nicht).

732voto

Ray Britton Punkte 8067

apply() wurde in 2.3 hinzugefügt, es überträgt ohne gibt einen booleschen Wert zurück, der Erfolg oder Misserfolg anzeigt.

commit() gibt zurück. wahr wenn das Speichern funktioniert, falsch sonst.

apply() wurde hinzugefügt, da das Android-Entwicklungsteam feststellte, dass fast niemand den Rückgabewert beachtete, so dass die Anwendung schneller ist, da sie asynchron ist.

[http://developer.Android.com/reference/Android/content/SharedPreferences.Editor.html#apply()](http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply())

271voto

Lukas Knuth Punkte 25019

tl;dr:

  • commit() schreibt die Daten synchron (Blockieren des Threads, von dem aus er aufgerufen wurde). Es dann informiert Sie über den Erfolg der Operation.
  • apply() plant die zu schreibenden Daten asynchron . Sie informiert nicht Sie über den Erfolg der Operation.
  • Wenn Sie sparen mit apply() y sofort lesen über eine beliebige getX-Methode, die nouveau Wert wird zurückgegeben!
  • Wenn Sie anrufen apply() zu einem bestimmten Zeitpunkt und es wird immer noch ausgeführt, werden alle Aufrufe an commit() blockiert, bis alle vergangenen apply-Aufrufe y der aktuelle Commit-Aufruf beendet ist.

Ausführlichere Informationen aus der SharedPreferences.Editor Dokumentation:

Anders als commit(), die ihre Einstellungen in den persistenten Speicher schreibt synchron , apply() überträgt seine Änderungen an die In-Memory SharedPreferences sofort, aber startet eine asynchrone Übertragung auf die Festplatte und Sie werden nicht über einen Fehlern . Wenn ein anderer Editor auf dieser SharedPreferences eine reguläre commit() durchführt, während ein apply() noch Commit() aussteht, wird das Commit() blockiert bis alle asynchronen Übertragungen abgeschlossen sind sowie die Übergabe selbst.

Da SharedPreferences-Instanzen Singletons innerhalb eines Prozesses sind, ist es sicher jede Instanz von commit() zu ersetzen durch apply() zu ersetzen, wenn Sie bereits den Rückgabewert ignorieren.

Die Schnittstelle SharedPreferences.Editor muss nicht direkt implementiert werden direkt. Wenn Sie jedoch zuvor es implementiert haben und jetzt Fehler über fehlende apply() erhalten, können Sie einfach commit() aus apply() aufrufen.

26voto

JoseLSegura Punkte 3720

Ich habe einige Probleme bei der Verwendung von apply() statt commit(). Wie bereits in anderen Antworten erwähnt, ist apply() asynchron. Ich habe das Problem, dass die Änderungen, die an einer "String-Set"-Einstellung vorgenommen werden, nie in den permanenten Speicher geschrieben werden.

Es passiert, wenn man das Programm "zwangsverhaftet" oder, in dem ROM, das ich auf meinem Gerät mit Android 4.1 installiert habe, wenn der Prozess vom System aufgrund von Speicherbedarf beendet wird.

Ich empfehle die Verwendung von "commit()" anstelle von "apply()", wenn Sie Ihre Einstellungen beibehalten wollen.

15voto

Mustafa Punkte 1601

Verwenden Sie apply().

Es schreibt die Änderungen sofort in den Arbeitsspeicher und wartet und schreibt sie danach in den internen Speicher (die eigentliche Einstellungsdatei). Commit schreibt die Änderungen synchron und direkt in die Datei.

15voto

Nurlan Sofiyev Punkte 469
  • commit() synchron ist, apply() ist asynchron

  • apply() ist eine ungültige Funktion.

  • commit() gibt true zurück, wenn die neuen Werte erfolgreich in den persistenten Speicher geschrieben wurden.

  • apply() Garantien abgeschlossen sind, bevor sie den Zustand wechseln, müssen Sie sich nicht um die Lebenszyklen von Android-Komponenten kümmern.

Wenn Sie den Wert nicht verwenden, der von commit() und Sie verwenden commit() vom Hauptthread aus, verwenden Sie apply() anstelle von commit()

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X