Doit accéder à SharedPreferences être fait dans le Thread de l'INTERFACE utilisateur?
Avec la sortie de pain d'épice, j'ai fait des expériences avec les nouvelles API, l'un d'eux étant StrictMode.
J'ai remarqué que l'une des mises en garde est pour getSharedPreferences()
.
C'est l'avertissement:
StrictMode policy violation; ~duration=1949 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=23 violation=2
et il est donné pour une getSharedPreferences()
d'achat sur le thread d'INTERFACE utilisateur.
Devrait SharedPreferences
d'accès et de modifications de vraiment faire le thread d'INTERFACE utilisateur?
- J'ai toujours fait ma préférence opérations sur le thread de l'INTERFACE utilisateur. Bien que je suppose que c'est logique, puisque c'est une opération e / s
Vous devez vous connecter pour publier un commentaire.
Je suis heureux que vous êtes déjà en train de jouer avec elle!
Des choses à noter: (la paresse de balle en forme)
En matière de chargement, même si...
une fois chargé, SharedPreferences sont des singletons et mis en cache au niveau de processus. si vous souhaitez le charger dès que possible si vous l'avez dans la mémoire avant d'en avoir besoin. (en supposant qu'elle est petite, comme il devrait l'être, si vous êtes en utilisant SharedPreferences, un simple fichier XML...) Vous ne voulez pas à la faute, dans l'avenir, le temps de l'utilisateur clique sur un bouton.
mais à chaque fois que vous contexte d'appel.getSharedPreferences(...), la sauvegarde de fichier XML est stat pour voir si ça a changé, de sorte que vous aurez envie d'éviter ces stats pendant les événements de l'UI de toute façon. Une stat devrait normalement être rapide (et souvent mis en cache), mais yaffs n'a pas beaucoup de la manière de la concurrence (et de beaucoup d'appareils Android exécuter sur yaffs... Droid, Nexus One, etc.) donc, si vous évitez de disque, vous éviter d'être coincé derrière les autres en vol ou en attente d'opérations sur le disque dur.
de sorte que vous aurez probablement envie de charger les SharedPreferences pendant votre onCreate() et de ré-utiliser la même instance, en évitant la stat.
mais si vous n'avez pas besoin de vos préférences, de toute façon pendant onCreate(), que le temps de chargement est de caler votre application start-up inutilement, donc c'est mieux d'avoir quelque chose comme un FutureTask<SharedPreferences> sous-classe qui lance un nouveau thread .set() la FutureTask sous-classes de la valeur. Puis juste la recherche de votre FutureTask<SharedPreferences>'s membre à chaque fois que vous en avez besoin et .get() il. J'ai l'intention de faire de ce libre derrière les scènes en Nid d'abeilles, de manière transparente. Je vais essayer de libérer un exemple de code qui
montre que les meilleures pratiques dans ce domaine.
Vérifier les Développeurs Android blog pour les prochains posts sur StrictMode sujets liés dans la semaine à venir(s).
L'accès partagé préférences peut prendre un certain temps, car ils sont lus à partir du stockage flash. Lisez-vous beaucoup? Vous pourriez peut-être utiliser un format différent, par exemple une base de données SQLite.
Mais ne permettent pas de résoudre tout ce que vous trouvez à l'aide de StrictMode. Ou, pour citer la documentation:
Une subtilité de Brad réponse: même si vous chargez les SharedPreferences dans onCreate(), vous devriez toujours lire les valeurs sur le thread d'arrière-plan parce que getString (), etc. bloc jusqu'à ce que la lecture du fichier partagé de préférence dans les finitions (sur un thread d'arrière-plan):
modifier() bloque également de la même manière, bien que les appliquer() semble être en sécurité sur le thread de premier plan.
(D'ailleurs désolé de mettre cela ici-bas. J'aurais mis cela comme un commentaire de Brad réponse, mais je viens d'adhérer et de ne pas avoir assez de réputation pour le faire.)
Je sais que c'est une vieille question, mais je veux partager mon approche. J'ai eu longtemps la lecture de fois et a utilisé une combinaison de partage des préférences et de l'application globale de la classe:
ApplicationClass:
LocalPreference:
MainActivity (activité qui appelés en premier dans votre demande):
Étapes expliquées:
REMARQUE: TOUJOURS vérifier si une application large de la variable est différente de NULL, la raison -> http://www.developerphil.com/dont-store-data-in-the-application-object/
Si je n'ai pas vérifier sur null je voudrais laisser un nullpointer à être projeté lors de l'appel par exemple getMaxDistance() sur l'objet de filtre (si l'objet de l'application a été lue à partir de la mémoire par Android)