Android - Partagé Préférences sont perdus parfois
Certains des utilisateurs de mon application se plaindre que, parfois (de façon aléatoire) les paramètres de mon application sont l'obtention de revenus à leur état par défaut (généralement après un redémarrage du téléphone). Je n'ai jamais réussi à reproduire le problème. Je pense qu'il est dû au fait que, dans de nombreux endroits dans mon application j'ai un morceau de code qui appelle la partagé éditeur de préférences et valide les modifications - Peut-il se résout à corrompre l'partagé fichier de préférences si j'essaie de valider plusieurs changements pour le même fichier de préférence à la même heure? (Multi-thread de l'application)
Je suis vraiment perdu. J'ai essayé de regarder dans le web pendant des heures pour trouver une solution, sans succès.
Si quelqu'un a une idée pour que je puisse commencer à enquêter, je vous serais reconnaissant.
Grâce,
Amit Moran
- La synchronisation de l'commet serait une première approche.
- Peut-être que vous avez écrit une clé null à un certain point ce serait clairement les préférences lorsque vous essayez de charger eux - voir : stackoverflow.com/questions/5368442/...
Vous devez vous connecter pour publier un commentaire.
J'avais l'écho de l'autre des réponses que vous avez besoin pour éviter les conflits, si vous ne voulez pas endommager le fichier et j'irais même jusqu'à suggérer que vous êtes probablement misuing SharedPreferences.
SPs sont conçus pour stocker de petits morceaux d'informations sur votre application utilisateur paramètres comme le volume ou la musique est en cours de lecture ou des choses comme ça.
SPs ne sont PAS conçus pour le stockage des données, qui change souvent et/ou de grandes quantités de données et c'est une mauvaise idée d'essayer de le faire (pour les raisons que vous avez découvert et quelques autres).
Rappelez-vous que les SPs sont vraiment juste un fichier XML que vous êtes supporter le surcoût de l'analyse et de les recréer à chaque fois que vous changez trop!
L'idée d'une Application qui met à jour SPs en plus d'un thread est un peu fou je pense que - vous besoin d'une meilleure façon de gérer et stocker les données que vous enregistrez - il va payer pour vous en plus d'une façon...
Selon la SharedPreferences.L'éditeur de documentation:
De cela, je suppose que plusieurs simultanément, s'engage ne sera pas vous débarrasser de vos préférences, mais il est possible que pas toutes les modifications que vous tentez d'écrire finira par écrit si plusieurs
Editor
instances sont utilisés en même temps. Pour éviter cela, vous pourriez mettre tous la préférence des modifications dans synchronisé blocs ou même utiliser une synchronisée méthode statique pour tous de préférence par écrit.Je vous suggère d'utiliser un singleton pour gérer les préférences. Si vous faites cela par la mise en œuvre d'un vrai java singleton, ou en utilisant Android Le Contexte De L'Application est à vous. (voir cette question pendant plusieurs de bons arguments pour/contre chacun)
Pour quelque chose comme
SharedPreferences
, c'est une bonne manière de les gérer, surtout pour un multi-thread de l'application. Cela permettra d'éviter peut-être certains de la remise en question de si oui ou non les commits sont en conflit les uns avec les autres. Cela peut ne pas être tout le problème, mais c'est quelque part au début.J'ai eu un problème similaire: mes préférences n'avait pas été enregistré de manière fiable. Sur certains appareils (dans mon cas, la XOOM Tablet) les données a parfois perdu, parfois non. J'ai résolu le problème en appelant simplement clear() sur l'éditeur avant de publier de nouvelles données.
Partagé Préférences de se perdre après l'arrêt de l'appareil ou de tuer l'application
J'ai découvert que j'étais en train de perdre une entrée particulière dans
SharedPreferences
par l'ouverture de l'éditeur, de faire ungetString
sur elle, et puiscommitting
sans faire unputString
sur l'entrée en premier, même si il n'y avait aucun changement nécessaire. Une fois que j'ai écrasé dans unputString
pour enregistrer la valeur de n'importe quoi, l'entrée arrêté de fuite après lacommit
.