Avec la sortie de Gingerbread, j'ai expérimenté certaines des nouvelles API, l'une d'entre elles étant StrictMode .
J'ai remarqué que l'un des avertissements est pour getSharedPreferences()
.
Voici l'avertissement:
StrictMode policy violation; ~duration=1949 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=23 violation=2
et il est donné pour un getSharedPreferences()
appel effectué sur le thread d'interface utilisateur.
L' SharedPreferences
accès et les modifications doivent-ils vraiment être effectués hors du thread de l'interface utilisateur?
android
sharedpreferences
android-strictmode
cotonBallPaws
la source
la source
Réponses:
Je suis content que vous jouiez déjà avec!
Quelques points à noter: (sous forme de puce paresseuse)
En ce qui concerne le chargement, cependant ...
une fois chargées, les SharedPreferences sont des singletons et mis en cache à l'échelle du processus. vous voulez donc le charger le plus tôt possible afin de l'avoir en mémoire avant d'en avoir besoin. (en supposant qu'il soit petit, comme il se doit si vous utilisez SharedPreferences, un simple fichier XML ...) Vous ne voulez pas le critiquer à l'avenir, un utilisateur clique sur un bouton.
mais chaque fois que vous appelez context.getSharedPreferences (...), le fichier XML de sauvegarde est statué pour voir s'il a changé, donc vous voudrez quand même éviter ces statistiques pendant les événements de l'interface utilisateur. Une statistique devrait normalement être rapide (et souvent mise en cache), mais les yaffs n'ont pas beaucoup de concurrence (et beaucoup d'appareils Android fonctionnent sur des yaffs ... Droid, Nexus One, etc.) donc si vous évitez le disque , vous évitez de rester coincé derrière d'autres opérations de disque en cours ou en attente.
vous voudrez donc probablement charger les SharedPreferences pendant votre onCreate () et réutiliser la même instance, en évitant la statistique.
mais si vous n'avez de toute façon pas besoin de vos préférences pendant onCreate (), ce temps de chargement stoppe inutilement le démarrage de votre application, il est donc généralement préférable d'avoir quelque chose comme une sous-classe FutureTask <SharedPreferences> qui lance un nouveau thread vers .set () la valeur des sous-classes FutureTask. Ensuite, recherchez simplement le membre de votre FutureTask <SharedPreferences> chaque fois que vous en avez besoin et .get (). Je prévois de rendre cela gratuit dans les coulisses de Honeycomb, de manière transparente. Je vais essayer de publier un exemple de code qui montre les meilleures pratiques dans ce domaine.
Consultez le blog des développeurs Android pour les articles à venir sur des sujets liés à StrictMode dans la ou les semaines à venir.
la source
L'accès aux préférences partagées peut prendre un certain temps car elles sont lues à partir du stockage flash. Lis-tu beaucoup? Vous pourriez peut-être utiliser un format différent, par exemple une base de données SQLite.
Mais ne corrigez pas tout ce que vous trouvez en utilisant StrictMode. Ou pour citer la documentation:
la source
Une subtilité à propos de la réponse de Brad: même si vous chargez les SharedPreferences dans onCreate (), vous devriez probablement toujours lire les valeurs sur le thread d'arrière-plan car getString () etc. bloquent jusqu'à ce que la lecture de la préférence de fichier partagé se termine (sur un thread d'arrière-plan):
edit () bloque également de la même manière, bien que apply () semble être sûr sur le thread de premier plan.
(BTW désolé de mettre cela ici. J'aurais mis cela en commentaire à la réponse de Brad, mais je viens de me joindre et je n'ai pas assez de réputation pour le faire.)
la source
Je sais que c'est une vieille question mais je veux partager mon approche. J'ai eu de longs temps de lecture et j'ai utilisé une combinaison de préférences partagées et de la classe d'application globale:
ApplicationClass:
LocalPreference:
MainActivity (activité qui est appelée en premier dans votre application):
Étapes expliquées:
REMARQUE: vérifiez TOUJOURS si une variable à l'échelle de l'application est différente de NULL, raison -> http://www.developerphil.com/dont-store-data-in-the-application-object/
Si je ne vérifiais pas la valeur null, j'autoriserais le lancement d'un pointeur nul lors de l'appel, par exemple, de getMaxDistance () sur l'objet filtre (si l'objet d'application a été glissé de la mémoire par Android)
la source
La classe SharedPreferences effectue des lectures et écritures dans des fichiers XML sur le disque, donc comme toute autre opération IO, elle peut être bloquante. La quantité de données actuellement stockées dans SharedPreferences affecte le temps et les ressources consommés par les appels d'API. Pour des quantités minimales de données, il suffit de quelques millisecondes (parfois même moins d'une milliseconde) pour obtenir / placer des données. Mais du point de vue d'un expert, il pourrait être important d'améliorer les performances en effectuant les appels d'API en arrière-plan. Pour un SharedPreferences asynchrone, je suggère de consulter la bibliothèque Datum .
la source