web-dev-qa-db-fra.com

Quelle est la différence entre commit () et apply () dans les préférences partagées

J'utilise les préférences partagées dans mon application Android. J'utilise à la fois les méthodes commit() et apply() de préférence partagée. Lorsque j'utilise AVD 2.3, cela ne montre aucune erreur, mais lorsque je lance le code dans AVD 2.1, la méthode apply() indique une erreur. SO Quelle est la différence entre ces deux? Et en utilisant uniquement commit(), puis-je enregistrer la valeur de préférence sans problème?

402
Andro Selva

apply() a été ajouté en 2.3, il commet sans renvoyer un booléen indiquant le succès ou l'échec.

commit() retourne true si la sauvegarde fonctionne, false sinon .

apply() a été ajouté lorsque Android l'équipe de développement a remarqué que presque personne n'avait pris note de la valeur renvoyée, donc appliquer est plus rapide car il est asynchrone.

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

619
Ray Britton

tl; dr:

  • commit() écrit les données de manière synchrone (bloquant le thread à partir duquel il est appelé). Il vous informe ensuite du succès de l'opération.
  • apply() planifie l'écriture des données de manière asynchrone . Il ne vous informe pas sur le succès de l'opération.
  • Si vous enregistrez avec apply() et que lit immédiatement via n’importe quelle méthode getX, le nouveau la valeur sera retournée!
  • Si vous avez appelé 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 apply passés et l'appel de validation en cours sont finis.

Informations plus détaillées provenant de la SharedPreferences.Editor Documentation:

Commit (), contrairement à , qui écrit ses préférences sur le stockage persistant de manière synchrone , apply () applique ses modifications à la SharedPreferences en mémoire immédiatement mais commence une validation asynchrone sur le disque et vous ne serez pas averti de tout échec . Si un autre éditeur sur cette SharedPreferences effectue une commit () régulière alors qu'une apply () est toujours en attente, commit () sera bloqué jusqu'à ce que toutes les validations asynchrones soient terminées, ainsi que la validation elle-même.

Comme les instances SharedPreferences sont des singletons dans un processus, il est prudent de remplacer toute instance de commit () par apply () si vous ignoriez déjà la valeur de retour.

L'interface SharedPreferences.Editor n'est pas censée être implémentée directement. Cependant, si vous l'aviez précédemment implémenté et que vous rencontriez maintenant des erreurs concernant le manque apply (), vous pouvez simplement appeler commit () depuis apply ().

200
Lukas Knuth

Je rencontre des problèmes en utilisant apply () à la place commit (). Comme indiqué précédemment dans d'autres réponses, apply () est asynchrone. Le problème est que les modifications apportées à une préférence "ensemble de chaînes" ne sont jamais écrites dans la mémoire persistante.

Cela arrive si vous "forcez la détention" du programme ou, dans le ROM que j'ai installé sur mon appareil avec Android 4.1, lorsque le processus est tué par le système en raison de la mémoire nécessités.

Je recommande d'utiliser "commit ()" à la place de "apply ()" si vous voulez que vos préférences restent actives.

22
JoseLSegura

Utilisez apply ().

Il écrit immédiatement les modifications dans la RAM, les attend et les écrit dans la mémoire de stockage interne (le fichier de préférences actuel) après. Commit écrit les modifications de manière synchrone et directement dans le fichier.

13
MurWade

La documentation explique assez bien la différence entre apply() et commit() :

Contrairement à commit(), qui écrit ses préférences dans le stockage persistant de manière synchrone, apply() enregistre immédiatement les modifications apportées à la mémoire SharedPreferences en mémoire, mais lance une validation asynchrone sur le disque et vous ne serez averti d'aucun échec. Si un autre éditeur sur cette SharedPreferences effectue une commit() régulière tant qu'une apply() est toujours en attente, la commit() sera bloquée jusqu'à ce que toutes les validations asynchrones soient terminées, ainsi que la validation elle-même. Comme SharedPreferences les instances sont des singletons dans un processus, il est prudent de remplacer toute instance de commit() par apply() si vous ignoriez déjà la valeur de retour.

12
Mojo Risin
  • commit() est synchrone, apply() est asynchrone

  • apply() est une fonction annulée.

  • commit() renvoie true si les nouvelles valeurs ont été écrites avec succès dans la mémoire persistante.

  • apply() garantit que vous avez terminé avant de changer d'état, vous n'avez pas à vous soucier de Android cycles de vie des composants

Si vous n'utilisez pas la valeur retournée par commit() et que vous utilisez commit() depuis le thread principal, utilisez apply() au lieu de commit()

12
Nurlan Sofiyev

De javadoc:

À la différence de commit (), qui écrit ses préférences dans le stockage persistant de manière synchrone, apply () valide immédiatement les modifications apportées aux SharedPreferences en mémoire, mais lance une validation asynchrone sur le disque et vous ne serez averti d'aucun échec. Si un autre éditeur sur cette SharedPreferences effectue une commit () régulière alors qu'un> apply () est toujours en attente, commit () bloquera jusqu'à ce que toutes les validations asynchrones soient terminées, ainsi que la validation elle-même.

6
Vladimir Ivanov

La différence entre commit () et apply ()

Nous pourrions être déroutés par ces deux termes, lorsque nous utilisons SharedPreference. En gros, elles sont probablement les mêmes, alors clarifions les différences entre commit () et apply ().

1. valeur de retour:

apply() s’engage sans retourner de booléen indiquant le succès ou l’échec. commit() renvoie true si la sauvegarde fonctionne, false sinon.

  1. La vitesse:

apply() est plus rapide. commit() est plus lent.

  1. Asynchrone Synchrone:

apply(): asynchrone commit(): synchrone

  1. Atomique:

apply(): atomic commit(): atomic

  1. Notification d'erreur:

apply(): Non commit(): Oui

0
ORBIT