2010-04-20 13 views
5

Tengo una clase de Preferencias estática que contiene algunas preferencias de aplicaciones y cosas por el estilo. ¿Está bien almacenar la referencia a ApplicationContext allí? Necesito esa referencia para poder obtener una carpeta de caché y cosas así en clases que no heredan Activity.Android: almacenamiento de referencias a ApplicationContext

Respuesta

6

Tiene razón al usar el ApplicationContext allí ya que si no lo hace it can cause significant memory leaks.

Sin embargo, el problema que tiene es que la variable static no puede conservar su valor. Debido a la forma en que Android maneja las aplicaciones, es posible que su aplicación se cancele y luego se reinicie, generalmente debido a que el usuario cambia a otras aplicaciones, de tal forma que su variable static se convertirá en nula y su código que lo establece se ganará ' se ejecutará Have a look at this question for a more detailed answer.

Es posible evitar este problema pero probar todas las posibilidades que pueden hacer que su variable termine en null sería lento y propenso a errores. Por lo tanto, en mis clases de preferencia estática, hice que cualquiera de los métodos que requieren un Context lo tome como argumento. Por ejemplo:

static int getSomeIntegerPreference(Context context) { 
    return PreferenceManager.getDefaultSharedPreferences(context).getInt(PREFERENCE_SOME_INTEGER, 0); 
} 

Es feo pero funciona.

+0

Bueno, configuré Preferences.applicationContext para getApplicationContent() en el primer inicio de la actividad. Así que creo que debería estar allí a menos que la aplicación muera (VM muere, el proceso se vuelve fatal, etc.). Y si se muere, en el próximo inicio inicializará Preferences.applicationContext de nuevo, así que creo que debería funcionar bien. Necesito algo así, porque necesito acceso al contexto en algunas clases que no ven getApplicationContext(). Por ejemplo, mi clase Categoría necesita descargar íconos para cada categoría, así que configuro icon_path para esto. filepath = Preferences.applicationContext.getCacheDir(). ToString – nixa

+1

Deberá inicializar 'Preferences.applicationContext' en * every * Activity que use su clase' Preferences'. Su proceso podría morir cuando ejecuta una actividad diferente a su primera actividad y Android puede devolver al usuario a ese punto en su aplicación, omitiendo la primera actividad. –

Cuestiones relacionadas