2010-04-20 11 views
5

Ho una classe di preferenze statiche che contiene alcune preferenze dell'applicazione e cose del genere. È corretto memorizzare il riferimento a ApplicationContext lì? Ho bisogno di questo riferimento in modo da poter ottenere la cartella cache e cose del genere in classi che non ereditano attività.Android - memorizzazione dei riferimenti a ApplicationContext

risposta

6

Si ha ragione di utilizzare il ApplicationContext lì se non si it can cause significant memory leaks.

Tuttavia, il problema è che la variabile static potrebbe non mantenere il suo valore. A causa del modo in cui Android gestisce le applicazioni è possibile che la tua applicazione possa essere uccisa e quindi riavviata, solitamente a causa del passaggio dell'utente ad altre applicazioni, in modo tale che la tua variabile static diventi nullo e il tuo codice che la imposta vada ' essere gestito Have a look at this question for a more detailed answer.

Potrebbe essere possibile ovviare a questo problema ma testare tutte le possibilità che potrebbero causare la terminazione della variabile null richiederebbe molto tempo e potrebbe comportare errori. Quindi, nelle mie classi di preferenze statiche ho realizzato uno qualsiasi dei metodi che richiedono un Context prenderlo come argomento. Ad esempio:

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

È brutto ma funziona.

+0

Bene, ho impostato il mio Preferences.applicationContext per getApplicationContent() all'avvio della prima attività. Quindi penso che dovrebbe essere lì a meno che l'applicazione non muoia (VM muore, processo diventa killer, ecc.). E se muore, al prossimo avvio inizializzerà di nuovo Preferences.applicationContext quindi penso che dovrebbe funzionare bene. Ho bisogno di qualcosa del genere, perché ho bisogno di accedere al contesto in alcune classi che non vedono getApplicationContext(). Ad esempio la mia categoria di categoria deve scaricare icone per ogni categoria, quindi ho impostato icon_path su questo. filepath = Preferences.applicationContext.getCacheDir(). ToString – nixa

+1

È necessario inizializzare 'Preferences.applicationContext' in * ogni * Attività che utilizza la classe' Preferences'. Il tuo processo potrebbe essere ucciso quando esegui un'attività diversa per la tua prima attività e Android può restituire l'utente a quel punto dell'applicazione, saltando la prima attività. –

Problemi correlati