Domanda

SharedPreferences docs che dice:

"Nota: attualmente questa classe non lo fa l'uso di sostegno su più processi. Questo sarà aggiunto in seguito. "

Quindi, in sé e per sé non sembra essere thread-safe. Tuttavia, ciò che tipo di garanzie sono fatti per quanto riguarda il commit () e applicare ()?

Ad esempio:

synchronized(uniqueIdLock){
   uniqueId = sharedPreferences.getInt("UNIQUE_INCREMENTING_ID", 0);
   uniqueId++;
   sharedPreferences.edit().putInt("UNIQUE_INCREMENTING_ID", uniqueId).commit();
}

sarebbe garantito che l'UniqueId era sempre unica in questo caso?

In caso contrario, c'è un modo migliore per tenere traccia di un ID univoco per un'applicazione che persiste?

È stato utile?

Soluzione

Thread e Processi sono diversi. L'implementazione SharedPreferences in Android è thread-safe, ma non processo di sicurezza. Normalmente la vostra applicazione verrà eseguito tutto nello stesso processo, ma è possibile che è possibile configurare nel AndroidManifest.xml così, per esempio, l'esecuzione del servizio in un processo separato rispetto, ad esempio, l'attività.

Per verificare la sicurezza flebile, vedere SharedPreferenceImpl del ContextImpl.java da AOSP. Nota c'è un sincronizzato, ovunque ci si aspetta la presenza di uno.

private static final class SharedPreferencesImpl implements SharedPreferences {
...
    public String getString(String key, String defValue) {
        synchronized (this) {
            String v = (String)mMap.get(key);
            return v != null ? v : defValue;
        }
   }
...
    public final class EditorImpl implements Editor {
        public Editor putString(String key, String value) {
            synchronized (this) {
                mModified.put(key, value);
                return this;
            }
        }
    ...
    }
}

Tuttavia per il vostro caso della ID univoco sembra che ci si vuole ancora una sincronizzata come non si vuole per cambiare tra il get e put.

Altri suggerimenti

Mi chiedevo la stessa cosa - e sono imbattuto in questo filetto che dice che non sono thread-safe:

Le implementazioni di Context.getSharedPreferences () e Editor.commit () Non sincronizzare sullo stesso monitor.


Ho dato guardato il codice di Android 14 per controllare, ed è abbastanza coinvolto. In particolare SharedPreferencesImpl sembra utilizzare diversi blocchi durante la lettura e la scrittura su disco:

  • serrature enqueueDiskWrite() su mWritingToDiskLock
  • serrature startLoadFromDisk() su this, e lancia un bloccaggio filo su SharedPreferencesImpl.this

Sono convinto che questo codice è davvero sicuro.

Si deve essere consapevole che SharedPreferences non stanno lavorando su cellulari Samsung, dare un'occhiata a Android problema .

Ho implementato semplice memorizzazione delle preferenze di database che potete trovare su github .

Saluti,

Credo che lo farà.

È possibile verificare utilizzando sonno all'interno della sezione sincronizzata e chiamare da diversi thread

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top