Con el lanzamiento de Gingerbread, he estado experimentando con algunas de las nuevas API, una de ellas StrictMode .
Noté que una de las advertencias es para getSharedPreferences()
.
Esta es la advertencia:
StrictMode policy violation; ~duration=1949 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=23 violation=2
y se está dando para una getSharedPreferences()
llamada que se realiza en el hilo de la interfaz de usuario.
¿Deberían realizarse SharedPreferences
cambios y acceso desde el hilo de la interfaz de usuario?
android
sharedpreferences
android-strictmode
cottonBallPaws
fuente
fuente
Respuestas:
¡Me alegra que ya estés jugando con él!
Algunas cosas a tener en cuenta: (en forma de bala perezosa)
Sin embargo, con respecto a la carga ...
una vez cargados, SharedPreferences son singletons y se almacenan en caché en todo el proceso. por lo que desea cargarlo lo antes posible para tenerlo en la memoria antes de que lo necesite. (asumiendo que es pequeño, como debería ser si está usando SharedPreferences, un archivo XML simple ...) No querrá que se le critique en el futuro si algún usuario hace clic en un botón.
pero cada vez que llama a context.getSharedPreferences (...), el archivo XML de respaldo se estadifica para ver si ha cambiado, por lo que querrá evitar esas estadísticas durante los eventos de la interfaz de usuario de todos modos. Una estadística normalmente debería ser rápida (y a menudo almacenada en caché), pero yaffs no tiene mucha simultaneidad (y muchos dispositivos Android se ejecutan en yaffs ... Droid, Nexus One, etc.) así que si evitas el disco , evita quedarse atascado detrás de otras operaciones de disco en curso o pendientes.
por lo que probablemente querrá cargar SharedPreferences durante su onCreate () y reutilizar la misma instancia, evitando el stat.
pero si no necesita sus preferencias de todos modos durante onCreate (), ese tiempo de carga está paralizando innecesariamente el inicio de su aplicación, por lo que generalmente es mejor tener algo como una subclase FutureTask <SharedPreferences> que inicie un nuevo hilo en .set () el valor de las subclases FutureTask. Luego, busque el miembro de FutureTask <SharedPreferences> siempre que lo necesite y .get (). Planeo hacer esto gratis detrás de escena en Honeycomb, de forma transparente. Intentaré publicar un código de muestra que muestre las mejores prácticas en esta área.
Consulte el blog de desarrolladores de Android para ver las próximas publicaciones sobre temas relacionados con StrictMode en las próximas semanas.
fuente
El acceso a las preferencias compartidas puede llevar bastante tiempo porque se leen desde el almacenamiento flash. ¿Lees mucho? Quizás pueda usar un formato diferente, por ejemplo, una base de datos SQLite.
Pero no arregle todo lo que encuentre usando StrictMode. O citar la documentación:
fuente
Una sutileza sobre la respuesta de Brad: incluso si carga SharedPreferences en onCreate (), probablemente aún debería leer los valores en el hilo de fondo porque getString (), etc. se bloquea hasta que lea la preferencia de archivo compartido en termina (en un hilo de fondo):
edit () también bloquea de la misma manera, aunque apply () parece ser seguro en el hilo de primer plano.
(Por cierto, lamento dejar esto aquí. Lo habría puesto como un comentario a la respuesta de Brad, pero me acabo de unir y no tengo la reputación suficiente para hacerlo).
fuente
Sé que esta es una pregunta antigua, pero quiero compartir mi enfoque. Tuve tiempos de lectura prolongados y usé una combinación de preferencias compartidas y la clase de aplicación global:
ApplicationClass:
LocalPreference:
MainActivity (actividad que se llama primero en su aplicación):
Pasos explicados:
NOTA: SIEMPRE verifique si una variable en toda la aplicación es diferente de NULL, razón -> http://www.developerphil.com/dont-store-data-in-the-application-object/
Si no marcara el valor nulo, permitiría que se lanzara un puntero nulo al llamar, por ejemplo, getMaxDistance () en el objeto de filtro (si Android borró el objeto de la aplicación de la memoria)
fuente
La clase SharedPreferences realiza algunas lecturas y escrituras dentro de los archivos XML en el disco, por lo que, al igual que cualquier otra operación de IO, podría estar bloqueando. La cantidad de datos almacenados actualmente en SharedPreferences afecta el tiempo y los recursos consumidos por las llamadas a la API. Para cantidades mínimas de datos, es cuestión de unos pocos milisegundos (a veces incluso menos de un milisegundo) obtener / colocar datos. Pero desde el punto de vista de un experto, podría ser importante mejorar el rendimiento haciendo las llamadas a la API en segundo plano. Para una SharedPreferences asincrónica, sugiero consultar la biblioteca Datum .
fuente