¿Cuál es la diferencia entre commit () y apply () en Shared Preference

Estoy usando la preferencia compartida en mi aplicación para Android. Estoy utilizando el método commit() y apply() de la preferencia compartida. Cuando uso AVD 2.3 no muestra ningún error, pero cuando ejecuto el código en AVD 2.1, apply() método muestra error. ¿Cuál es la diferencia entre estos dos? Y utilizando sólo commit() ¿puedo almacenar el valor de preferencia sin ningún problema?

apply() se agregó en 2.3, se compromete sin devolver un booleano indicando éxito o error.

commit() devuelve true si la salvación funciona, false en caso contrario.

apply() se agregó como el equipo de desarrollo de Android se dio cuenta de que casi nadie tomó nota del valor de retorno, por lo que aplicar es más rápido, ya que es asíncrono.

http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply ()

Dr

  • commit() escribe los datos de forma sincrónica (bloqueando el subproceso de su llamado). A continuación, le informa sobre el éxito de la operación.
  • apply() programa los datos para que se escriban asincrónicamente . No le informa sobre el éxito de la operación.
  • Si guarda con apply() e inmediatamente lee a través de cualquier método getX, el nuevo valor será devuelto!
  • Si llamó apply() en algún momento y todavía se está ejecutando, las llamadas a commit() se bloquearán hasta que todas las llamadas apply y su propia confirmación hayan finalizado.

Más información 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 un commit asincrónico en disco y no se le notificará de ningún fallo . Si otro editor de SharedPreferences realiza un commit () regular mientras que apply () sigue pendiente, el commit () se bloqueará hasta que todos los commit async se completen, así como el commit mismo.

Como las instancias de SharedPreferences son singletons dentro de un proceso, es seguro reemplazar cualquier instancia de commit () por apply () si ya está ignorando el valor devuelto.

No se espera que la interfaz SharedPreferences.Editor se implemente directamente. Sin embargo, si anteriormente lo implementó y ahora está recibiendo errores sobre missing apply (), simplemente puede llamar a commit () de apply ().

Estoy experimentando algunos problemas usando apply () en lugar de commit (). Como se ha dicho antes en otras respuestas, la aplicación () es asíncrona. Estoy recibiendo el problema de que los cambios formados a una "serie de caracteres" preferencia nunca se escriben en la memoria persistente.

Sucede si "detiene" el programa o, en la ROM que he instalado en mi dispositivo con Android 4.1, cuando el proceso es matado por el sistema debido a necesidades de memoria.

Recomiendo utilizar "commit ()" en lugar de "apply ()" si desea que sus preferencias vivas.

Los documentos dan una explicación bastante buena de la diferencia entre apply() y commit() :

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 un commit asincrónico en disco y no se le notificará de ningún error. Si otro editor de SharedPreferences realiza un commit() regular mientras que apply() sigue pendiente, el commit() se bloqueará hasta que todos los commit async se completen, así como el commit mismo. Como SharedPreferences instancias de SharedPreferences son singletons dentro de un proceso, es seguro reemplazar cualquier instancia de commit() por apply() si ya está ignorando el valor devuelto.

Utilice apply ().

Escribe los cambios en la memoria RAM de inmediato y espera y lo escribe en el almacenamiento interno (el archivo de preferencias real) después. Confirmar escribe los cambios de forma síncrona y directamente en el archivo.

De javadoc:

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 un commit asincrónico en disco y no se le notificará de ningún error. Si otro editor de SharedPreferences hace un commit () regular mientras que un> apply () sigue pendiente, el commit () bloqueará hasta que todos los commit async se completen, así como el commit mismo

  • commit() es sincrónicamente, apply() es asíncrono

  • apply() es la función void.

  • commit() devuelve true si los nuevos valores se escribieron correctamente en almacenamiento persistente.

  • apply() garantiza que se complete antes de cambiar de estado, no es necesario preocuparse por los ciclos de vida de los componentes de Android

Si no utiliza el valor devuelto por commit() y está utilizando commit() desde el subproceso principal, use apply() lugar de commit()

  • Android SharedPreferences Conjunto de cadenas: algunos elementos se quitan después de reiniciar la aplicación
  • Cómo almacenar un objeto Date en SharedPreferences?
  • SharedPreferences putStringSet no funciona
  • Cómo lograr el concepto NSUserDefaults en Android
  • Agregar preferencias dinámicas de la casilla de verificación en Android y mostrarlas en la pantalla de preferencias?
  • Cómo mostrar sólo una vez Iniciar sesión y luego después de iniciar la aplicación directamente en android
  • OnSharedPreferenceChanged no se dispara si se produce un cambio en una actividad independiente?
  • Obtenga el valor de preferencias compartidas de Android en la clase activity / normal
  • registerOnSharedPreferenceChangeListener no funciona para los cambios realizados en diferentes procesos
  • Copia de seguridad / restauración de preferencias compartidas android
  • Array de cadenas en SharedPreferences
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.