¿Cuál es la diferencia entre commit() y apply() en SharedPreferences?
Estoy usando SharedPreferences
en mi aplicación de Android. Estoy usando ambos commit()
métodos apply()
y de preferencia compartida. Cuando uso AVD 2.3 no muestra ningún error, pero cuando ejecuto el código en AVD 2.1, apply()
el método muestra un error.
Entonces, ¿cuál es la diferencia entre estos dos? ¿ Y usando solo commit()
puedo almacenar el valor de preferencia sin ningún problema?
apply()
se agregó en 2.3, se confirma sin devolver un valor booleano que indique éxito o fracaso.
commit()
Devuelve verdadero si el guardado funciona, falso en caso contrario.
apply()
se agregó cuando el equipo de desarrollo de Android notó que casi nadie se dio cuenta del valor de retorno, por lo que la aplicación es más rápida ya que es asincrónica.
http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply()
tl;dr:
commit()
escribe los datos de forma sincrónica (bloqueando el hilo desde el que se llama). Luego le informa sobre el éxito de la operación.apply()
programa los datos que se escribirán de forma asincrónica . No le informa sobre el éxito de la operación.- Si guarda
apply()
y lee inmediatamente a través de cualquier método getX, se devolverá el nuevo valor. - Si llamó
apply()
en algún momento y aún se está ejecutando, cualquier llamada acommit()
se bloqueará hasta que finalicen todas las llamadas de aplicación anteriores y la llamada de confirmación actual.
Información más detallada de la documentación de SharedPreferences.Editor :
A diferencia de commit(), que escribe sus preferencias en el almacenamiento persistente de forma sincrónica , apply() confirma sus cambios en SharedPreferences en memoria inmediatamente pero inicia una confirmación asincrónica en el disco y no se le notificará ninguna falla . Si otro editor en SharedPreferences realiza una confirmación () normal mientras una aplicación () aún está pendiente, la confirmación () se bloqueará hasta que se completen todas las confirmaciones asíncronas, así como la confirmación misma.
Como las instancias de SharedPreferences son singleton dentro de un proceso, es seguro reemplazar cualquier instancia de commit() con apply() si ya estaba ignorando el valor de retorno.
No se espera que la interfaz SharedPreferences.Editor se implemente directamente. Sin embargo, si lo implementó anteriormente y ahora recibe errores por falta de apply(), simplemente puede llamar a commit() desde apply().
Estoy experimentando algunos problemas al usar apply() en lugar de commit(). Como se indicó anteriormente en otras respuestas, apply() es asincrónico. Tengo el problema de que los cambios formados en una preferencia de "conjunto de cadenas" nunca se escriben en la memoria persistente.
Ocurre si "fuerzas la detención" del programa o, en la ROM que tengo instalada en mi dispositivo con Android 4.1, cuando el sistema mata el proceso por necesidades de memoria.
Recomiendo usar "commit()" en lugar de "apply()" si desea que sus preferencias estén vivas.