2012-07-19 19 views
35

Sto utilizzando diverse SharedPreferences per memorizzare i dati nella mia app. Alcune preferenze sono utilizzate in molte attività.Contesto di applicazione SharedPreferences contesto di attività

So che le SharedPreferences sono internamente supportate da una mappa per l'accesso rapido in lettura e scritte su sdcard quando le impostazioni vengono modificate.

Mi chiedo da che parte è meglio se uno sharedpreference si accede da un sacco di activies:

  1. un'istanza in ogni attività utilizzando il contesto di attività.
  2. Istanziare in ogni attività, ma utilizzando il contesto dell'applicazione.
  3. Inseritelo ad es. la classe Application e la istanzia solo una volta lì, simile a un singleton.

Se uso 1. Soluzione c'è un oggetto sharedpreference per ogni attività? E la mappa interna di sharedpreference verrà distrutta quando l'attività viene distrutta?

Se utilizzo 2. soluzione, ci sarà una sola istanza, anche se chiamo getSharedPreferences in ogni attività? E la mappa interna sarà in memoria finché l'applicazione è viva?

Speriamo che qualcuno sappia come Android lo gestisce internamente.

+0

Consiglierei la scelta tre, è possibile accedere da tutte le attività e basta fare una lettura. – Joel

risposta

55

Vale la pena di rivedere la sources che mostrano che un'istanza Context (sia esso un Activity o un Application esempio) condividono la stessa mappa statica HashMap<String, SharedPreferencesImpl>.

Così ogni volta che si richiede un'istanza SharedPreferences con lo stesso nome tramite Context.getSharedPreferences(name, mode) si ottiene la stessa istanza dal momento che prima controlla se la mappa contiene già SharedPreferences istanza per una chiave (che è il nome passato). Una volta caricata l'istanza SharedPreferences, non verrà caricata di nuovo, ma verrà invece prelevata dalla mappa.

Quindi in realtà non importa da che parte si va, l'importante è usare lo stesso nome per ottenere gli stessi prefs da diverse parti dell'applicazione. Tuttavia la creazione di un singolo "punto di accesso" per i pref potrebbe essere un vantaggio. Quindi potrebbe essere un wrapper singleton sui prefs istanziati in Application.onCreate().

+0

+1 Anche io ci credevo ... Grazie per la ratifica – Rasmus

7

io preferisco utilizzare un Singleton classe per preferenza, inizializzare preferenza una volta dal contesto di applicazione. creare metodi getter e setter (get/put) per aggiungere, aggiornare ed eliminare i dati.

In questo modo crea istanza una volta e può essere più leggibile, riutilizzabile.

+0

Inoltre è utile quando un'applicazione ritorna dalla richiesta HTTP. In questo caso, un contesto (attività) potrebbe non esistere, quindi context.getSharedPreferences porterà a NPE. Quando si usa un singleton questo non succederà. – CoolMind

11

SharedPreferences sono gestiti internamente da Android come singleton. È possibile ottenere il maggior numero di casi che si desidera utilizzare:

context.getSharedPreferences(name, mode); 

fino a quando si utilizza lo stesso nome , avrete sempre la stessa istanza . Quindi non ci sono problemi di concorrenza.

Problemi correlati