2012-07-19 36 views
35

Estoy usando varias SharedPreferences para almacenar datos en mi aplicación. Algunas preferencias se usan en muchas actividades.contexto de la aplicación SharedPreferences frente al contexto de actividad

Sé que las Preferencias Compartidas están respaldadas internamente por un mapa para un acceso de lectura rápido y escritas en una tarjeta SD cuando se cambian las configuraciones.

Me pregunto qué camino es mejor si un sharedpreference se accede por una gran cantidad de Actividades al:

  1. instanciarlo en cada actividad utilizando el contexto de la actividad.
  2. Crea una instancia en cada actividad, pero utilizando el contexto de la aplicación.
  3. Ponla en, por ejemplo, la clase de aplicación y crear una instancia solo una vez allí, similar a un singleton.

Si uso 1. ¿Existe un objeto de preferencia compartida para cada actividad? ¿Y se destruirá el mapa interno de la preferencia compartida cuando se destruya la actividad?

Si utilizo 2. solution habrá solo una instancia, aunque llamo getSharedPreferences en cada actividad? ¿Y el mapa interno estará en la memoria mientras la aplicación esté activa?

Esperemos que alguien sepa cómo Android lo maneja internamente.

+0

Recomendaría la opción tres, puede acceder desde todas sus actividades y solo tiene que leer una. – Joel

Respuesta

55

Vale la pena revisar la sources que muestran que una Context instancia (ya sea un Activity o una instancia Application) comparten el mismo mapa estático HashMap<String, SharedPreferencesImpl>.

Así que cuando usted solicita una instancia de SharedPreferences por el mismo nombre a través de Context.getSharedPreferences(name, mode) se obtiene la misma instancia, ya que primero comprueba si el mapa contiene ya SharedPreferences ejemplo de una clave (que es el nombre aprobado). Una vez que se carga la instancia SharedPreferences, no se volverá a cargar, sino que se tomará del mapa.

Así que en realidad no importa qué camino tome, lo importante es usar el mismo nombre para obtener las mismas preferencias de las diferentes partes de la aplicación. Sin embargo, crear un único "punto de acceso" para las preferencias podría ser un plus. Por lo tanto, podría ser un contenedor único sobre las preferencias instanciadas en Application.onCreate().

+0

+1 Incluso yo creí eso ... Gracias por ratificar – Rasmus

7

voy a preferir el uso de una clase Singleton de preferencia, inicializar preferencia una vez por contexto de aplicación. crear métodos getter y setter (get/put) para agregar, actualizar y eliminar datos.

De esta manera creará instancia una vez y puede ser más legible, reutilizable.

+0

También es bueno cuando una aplicación regresa de una solicitud HTTP. En este caso, un contexto (actividad) puede no existir, por lo que context.getSharedPreferences conducirá a NPE. Cuando se utiliza un singleton esto no sucederá. – CoolMind

11

SharedPreferences son administrados internamente por Android como singletons. Puede solicitar tantos instancias como desee usando:

context.getSharedPreferences(name, mode); 

, siempre y cuando se utiliza el mismo nombre de , siempre obtendrá la misma instancia . Por lo tanto, no hay problemas de simultaneidad.

Cuestiones relacionadas