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).

13voto

Mojo Risin Punkte 8132

Die Dokumentation erklärt recht gut den Unterschied zwischen apply() y commit() :

Anders als commit() die ihre Einstellungen in persistente Speicher synchron schreibt, apply() überträgt seine Änderungen in die speicherinterne SharedPreferences sofort, sondern startet eine asynchrone Übergabe an auf die Festplatte und Sie werden nicht über etwaige Fehler benachrichtigt. Wenn ein anderer Editor auf dieser SharedPreferences macht eine regelmäßige commit() während ein apply() ist noch aussteht, wird die commit() wird blockiert, bis alle asynchronen Übertragungen abgeschlossen sind, sowie die Übertragung selbst. Als SharedPreferences Instanzen innerhalb eines Prozesses Singletons sind, ist es sicher, jede Instanz von commit() con apply() wenn Sie den Rückgabewert bereits ignoriert haben.

12voto

Der Unterschied zwischen commit() und apply()

Diese beiden Begriffe könnten uns verwirren, wenn wir SharedPreference verwenden. Im Grunde sind sie wahrscheinlich dasselbe, also lassen Sie uns die Unterschiede von commit() und apply() klären.

1.Rückgabewert:

apply() überträgt, ohne einen Booleschen Wert zurückzugeben, der Erfolg oder Misserfolg anzeigt. commit( ) gibt true zurück, wenn das Speichern funktioniert, andernfalls false.

  1. Geschwindigkeit:

apply() ist schneller. commit() ist langsamer.

  1. Asynchron vs. Synchron:

apply() : Asynchron commit() : Synchron

  1. Atomar:

apply() : atomar commit() : atomar

  1. Fehlermeldung:

apply() : Nein commit() : Ja

7voto

Vladimir Ivanov Punkte 42019

Aus javadoc:

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

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