Pregunta

En cuanto a la SharedPreferences docs que dice:

"Nota: Actualmente esta clase no lo hace uso de apoyo a través de múltiples procesos. Esto se añadió más tarde ".

Así que en sí mismo no parece ser seguro para subprocesos. Sin embargo, ¿qué tipo de garantías se hacen en lo que respecta a commit () y aplicar ()?

Por ejemplo:

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

¿Se puede garantizar que la uniqueId siempre era único en este caso?

Si no, ¿hay una mejor manera de hacer un seguimiento de un identificador único para una aplicación que persiste?

¿Fue útil?

Solución

procesos y subprocesos son diferentes. La aplicación SharedPreferences en Android es seguro para subprocesos, pero no en el proceso de fallos. Normalmente su aplicación se ejecutará en el mismo proceso, pero es posible que usted pueda configurar en el AndroidManifest.xml así, por ejemplo, se ejecuta el servicio en un proceso separado que, por ejemplo, la actividad.

Para verificar la seguridad filiforme, ver SharedPreferenceImpl del ContextImpl.java de AOSP. Nota hay una transferencia sincronizada donde era de esperar que exista 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;
            }
        }
    ...
    }
}

Sin embargo, para el caso de la identificación única que parece que todavía querría una sincronizada y cuando no se quiere que se cambie entre el get y la opción de venta.

Otros consejos

Me preguntaba lo mismo - y me encontré con este hilo que dice que no es seguro para subprocesos:

Las implementaciones de Context.getSharedPreferences () y Editor.commit () No se sincronizan en el mismo monitor.


He mirado desde el código de Android 14 para comprobar, y es muy involucrados. Específicamente SharedPreferencesImpl parece utilizar las cerraduras diferentes al leer y escribir en el disco:

  • cerraduras enqueueDiskWrite() en mWritingToDiskLock
  • cerraduras startLoadFromDisk() en this, y lanza un bloqueo de roscas en SharedPreferencesImpl.this

Estoy convencido de que este código es muy seguro.

Se debe tener en cuenta que SharedPreferences no están trabajando en teléfonos Samsung, echar un vistazo a androide tema .

He implementado sencilla de almacenamiento preferencias de la base, que se puede encontrar en github .

Saludos,

Creo que va a hacerlo.

Puede probarlo utilizando el sueño dentro de la sección sincronizada y llamarlo desde diferentes hilos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top