132 votes

Pour accéder aux SharedPreferences soient éteindre le Thread d’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 c'est donné pour un 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?

195voto

Brad Fitzpatrick Points 2066

Je suis heureux que vous êtes déjà en train de jouer avec elle!

Certaines choses sont à noter: (en paresseux points)

  • si c'est le pire de vos problèmes, de votre application, probablement dans un bon endroit. :) Écrit sont généralement plus lents que les lectures, cependant, alors assurez-vous que vous utilisez SharedPreferenced$de l'Éditeur.appliquer() au lieu de commit(). apply() est de nouveau en GO et asynchrone (mais toujours en sécurité, à l'attention du cycle de vie des transitions). Vous pouvez utiliser la réflexion pour conditionnellement appeler apply() sur GB+ et commit() sur Froyo ou ci-dessous. Je vais faire un article sur le blog avec des exemples de code pour le faire.

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>'membre à chaque fois que vous en avez besoin et .get (). 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).

7voto

mreichelt Points 6217

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 pas corriger tout ce que vous trouvez à l'aide de StrictMode. Ou, pour citer la documentation:

Mais ne vous sentez pas obligé de corriger tout ce qui StrictMode trouve. En particulier, de nombreux cas de l'accès au disque est souvent nécessaire lors de l'activité normale du cycle de vie. Utilisation StrictMode de trouver des choses que vous avez fait par accident. Les demandes de réseau sur le thread d'INTERFACE utilisateur sont presque toujours un problème, cependant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X