¿Cuál es la diferencia entre commit() y apply() en SharedPreferences?

Resuelto Andro Selva asked hace 54 años • 9 respuestas

Estoy usando SharedPreferencesen 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?

Andro Selva avatar Jan 01 '70 08:01 Andro Selva
Aceptado

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()

 avatar May 11 '2011 07:05

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 a commit()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().

Lukas Knuth avatar May 11 '2011 07:05 Lukas Knuth

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.

JoseLSegura avatar Dec 17 '2012 08:12 JoseLSegura