J'utilise SharedPreferences
dans mon application Android. J'utilise les deux commit()
et la apply()
méthode de préférence partagée. Lorsque j'utilise AVD 2.3, il ne montre aucune erreur, mais lorsque j'exécute le code dans AVD 2.1, la apply()
méthode affiche une erreur.
Alors, quelle est la différence entre ces deux? Et en utilisant uniquement, commit()
puis-je stocker la valeur de préférence sans aucun problème?
android
sharedpreferences
Andro Selva
la source
la source
apply()
fera les E / S disque de manière asynchrone alors qu'ilcommit()
est synchrone. Donc, vous ne devriez vraiment pas appeler àcommit()
partir du thread d'interface utilisateur.apply()
gagne. Par conséquent, vous pouvez utiliserapply()
en lieu et place encommit()
toute sécurité si vous vous assurez qu'un seul SharedPreferences.Editor est utilisé par votre application.commit()
?Réponses:
apply()
a été ajouté en 2.3, il valide sans retourner un booléen indiquant un succès ou un échec.commit()
renvoie vrai si la sauvegarde fonctionne, faux sinon.apply()
a été ajouté car l'équipe de développement Android a remarqué que presque personne n'avait remarqué la valeur de retour, donc appliquer est plus rapide car il est asynchrone.http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply ()
la source
tl; dr:
commit()
écrit les données de façon synchrone (bloquant le thread appelé). Il vous informe ensuite du succès de l'opération.apply()
planifie l'écriture asynchrone des données . Il ne vous informe pas du succès de l'opération.apply()
et lisez immédiatement via n'importe quelle méthode getX, la nouvelle valeur sera retournée!apply()
à un moment donné et qu'il est toujours en cours d'exécution, tous les appels àcommit()
seront bloqués jusqu'à ce que tous les appels d'application passés et l'appel de validation en cours soient terminés.Informations plus détaillées dans la documentation SharedPreferences.Editor :
la source
apply()
les écritures asynchrones et en attente bloquent les appels futurs verscommit()
.Je rencontre des problèmes avec apply () à la place commit (). Comme indiqué précédemment dans d'autres réponses, la méthode apply () est asynchrone. J'obtiens le problème que les modifications apportées à une préférence "jeu de chaînes" ne sont jamais écrites dans la mémoire persistante.
Cela se produit si vous "forcez la détention" du programme ou, dans la ROM que j'ai installée sur mon appareil avec Android 4.1, lorsque le processus est tué par le système en raison de besoins en mémoire.
Je recommande d'utiliser "commit ()" à la place de "apply ()" si vous voulez que vos préférences soient vivantes.
la source
Utilisez Appliquer ().
Il écrit les modifications dans la RAM immédiatement et attend et les écrit dans la mémoire interne (le fichier de préférence réel) après. Commit écrit les modifications de manière synchrone et directe dans le fichier.
la source
commit()
est synchrone,apply()
est asynchroneapply()
est une fonction nulle.commit()
renvoie true si les nouvelles valeurs ont été correctement écrites sur le stockage persistant.apply()
garanties complètes avant de changer d'état, vous n'avez pas à vous soucier des cycles de vie des composants AndroidSi vous n'utilisez pas la valeur renvoyée par
commit()
et que vous utilisez àcommit()
partir du thread principal, utilisezapply()
au lieu decommit()
la source
Les documents donnent une assez bonne explication de la différence entre
apply()
etcommit()
:la source
De javadoc:
la source
Nous pouvons être confondus par ces deux termes, lorsque nous utilisons SharedPreference. Fondamentalement, ils sont probablement les mêmes, alors clarifions les différences de commit () et apply ().
apply()
valide sans renvoyer un booléen indiquant un succès ou un échec.commit(
) retourne vrai si la sauvegarde fonctionne, faux sinon.apply()
est plus rapide.commit()
est plus lent.apply()
: Asynchronecommit()
: synchroneapply()
: atomiquecommit()
: atomiqueapply()
: Noncommit()
: ouila source
apply()
"plus rapide" quecommit()
? Ils représentent essentiellement une même tâche qui serait mise en Looper du thread.commit()
place cette tâche dans le Looper principal tout en laapply()
prenant en arrière-plan, gardant ainsi le Looper principal libre de toute tâche d'E / S disque.