2010-04-20 3 views
5

J'ai une classe de préférences statique qui contient certaines préférences d'application et des choses comme ça. Est-il correct de stocker la référence à ApplicationContext là? J'ai besoin de cette référence afin que je puisse obtenir le dossier de cache et des choses comme ça dans les classes qui n'héritent pas d'activité.Android - stocker des références à ApplicationContext

Répondre

6

Vous avez raison d'utiliser le ApplicationContext depuis si vous n'avez pas it can cause significant memory leaks.

Toutefois, le problème que vous avez est que la variable static peut ne pas conserver sa valeur. En raison de la façon dont Android gère les applications, il est possible que votre application soit supprimée puis redémarrée - généralement parce que l'utilisateur passe à d'autres applications - de sorte que votre variable static devienne nulle et votre code qui la définit ' t être exécuté. Have a look at this question for a more detailed answer.

Il est peut-être possible de contourner ce problème, mais tester toutes les possibilités qui peuvent entraîner la fin de votre variable null serait long et sujet aux erreurs. Donc, dans mes classes de préférences statiques, j'ai fait l'une des méthodes qui nécessitent un Context le prendre comme argument. Par exemple:

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

Il est moche, mais cela fonctionne.

+0

Eh bien, j'ai défini mes Preferences.applicationContext à getApplicationContent() au premier démarrage de l'activité. Donc je pense que ça devrait être là sauf si l'application meurt (VM meurt, le processus devient tueur, etc.). Et s'il meurt, au prochain démarrage, il initialisera à nouveau Preferences.applicationContext, donc je pense que cela devrait fonctionner. J'ai besoin de quelque chose comme ça, car j'ai besoin d'accéder au contexte dans certaines classes qui ne voient pas getApplicationContext(). Par exemple, ma classe de catégorie a besoin de télécharger des icônes pour chaque catégorie, donc j'ai mis icon_path à cela. filepath = Preferences.applicationContext.getCacheDir(). ToString – nixa

+1

Vous devez initialiser 'Preferences.applicationContext' dans * chaque * activité utilisant votre classe' Preferences'. Votre processus peut être tué lorsque vous exécutez une activité différente de votre première activité et Android peut renvoyer l'utilisateur à ce point dans votre application, en ignorant la première activité. –

Questions connexes