Ich benutze SharedPreferences
in meiner Android App. Ich benutze beide commit()
und apply()
Methode aus gemeinsamen Präferenzen. Wenn ich AVD 2.3 verwende, wird kein Fehler angezeigt. Wenn ich jedoch den Code in AVD 2.1 ausführe, apply()
zeigt die Methode einen Fehler an.
Was ist der Unterschied zwischen diesen beiden? Und wenn commit()
ich nur benutze, kann ich den Präferenzwert problemlos speichern?
android
sharedpreferences
Andro Selva
quelle
quelle
apply()
Wird asynchron Festplatten-E / A ausführen, währendcommit()
es synchron ist. Sie sollten also wirklich nichtcommit()
vom UI-Thread aus aufrufen .apply()
gewinnt das letzte, das aufgerufen wird . Daher können Sieapply()
anstelle voncommit()
sicher verwenden, wenn Sie sicherstellen, dass nur eine SharedPreferences.Editor von Ihrer Anwendung verwendet wird.commit()
?Antworten:
apply()
wurde in 2.3 hinzugefügt, es wird festgeschrieben, ohne einen Booleschen Wert zurückzugeben, der Erfolg oder Misserfolg anzeigt.commit()
Gibt true zurück , wenn das Speichern funktioniert, andernfalls false .apply()
wurde hinzugefügt, als das Android-Entwicklerteam bemerkte, dass fast niemand den Rückgabewert zur Kenntnis nahm. Daher ist die Anwendung schneller als asynchron.http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply ()
quelle
tl; dr:
commit()
schreibt die Daten synchron (blockiert den Thread, von dem aus er aufgerufen wird). Anschließend werden Sie über den Erfolg der Operation informiert .apply()
Plant die asynchron zu schreibenden Daten . Es informiert Sie nicht über den Erfolg der Operation.apply()
und sofort lesen , wird der neue Wert zurückgegeben!apply()
irgendwann angerufen haben und es noch ausgeführt wird, werden alle Aufrufe voncommit()
blockiert, bis alle vergangenen Apply-Aufrufe und der aktuelle Commit-Aufruf beendet sind.Weitere Informationen finden Sie in der SharedPreferences.Editor- Dokumentation:
quelle
apply()
asynchrone und ausstehende Schreibvorgänge zukünftige Aufrufe blockierencommit()
.Ich habe einige Probleme mit apply () anstelle von commit (). Wie bereits in anderen Antworten erwähnt, ist apply () asynchron. Ich habe das Problem, dass die Änderungen, die an einer "Zeichenfolgensatz" -Einstellung vorgenommen wurden, niemals in den persistenten Speicher geschrieben werden.
Es passiert, wenn Sie das Programm "erzwingen" oder in dem ROM, das ich mit Android 4.1 auf meinem Gerät installiert habe, wenn der Prozess vom System aufgrund von Speicherbedarf abgebrochen wird.
Ich empfehle, "commit ()" anstelle von "apply ()" zu verwenden, wenn Sie möchten, dass Ihre Einstellungen lebendig bleiben.
quelle
Verwenden Sie apply ().
Es schreibt die Änderungen sofort in den RAM und wartet und schreibt sie anschließend in den internen Speicher (die eigentliche Voreinstellungsdatei). Commit schreibt die Änderungen synchron und direkt in die Datei.
quelle
commit()
ist synchron,apply()
ist asynchronapply()
ist nichtige Funktion.commit()
Gibt true zurück, wenn die neuen Werte erfolgreich in den dauerhaften Speicher geschrieben wurden.apply()
Garantien vollständig, bevor Sie den Status wechseln. Sie müssen sich keine Gedanken über den Lebenszyklus von Android-Komponenten machenWenn Sie den von
commit()
undcommit()
vom Hauptthread zurückgegebenen Wert nicht verwenden , verwenden Sieapply()
anstelle voncommit()
quelle
Die Dokumente geben eine ziemlich gute Erklärung für den Unterschied zwischen
apply()
undcommit()
:quelle
Aus Javadoc:
quelle
Diese beiden Begriffe könnten uns verwirren, wenn wir SharedPreference verwenden. Grundsätzlich sind sie wahrscheinlich gleich. Lassen Sie uns also die Unterschiede zwischen commit () und apply () klären.
apply()
Commits ohne Rückgabe eines Booleschen Werts, der Erfolg oder Misserfolg anzeigt.commit(
) gibt true zurück, wenn das Speichern funktioniert, andernfalls false.apply()
ist schneller.commit()
ist langsamer.apply()
: Asynchroncommit()
: Synchronapply()
: atomarcommit()
: atomarapply()
: Neincommit()
: Jaquelle
apply()
"schneller" alscommit()
? Sie stellen im Wesentlichen dieselbe Aufgabe dar, die in Looper des Threads ausgeführt wird.commit()
Setzt diese Aufgabe in den Haupt-Looper, währendapply()
sie im Hintergrund angezeigt wird, wodurch der Haupt-Looper frei von Festplatten-E / A-Aufgaben bleibt.