Estoy usando SharedPreferences
en mi aplicación de Android. Estoy usando ambos commit()
y el apply()
método de preferencia compartida. Cuando uso AVD 2.3 no muestra ningún error, pero cuando ejecuto el código en AVD 2.1, el apply()
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?
android
sharedpreferences
Andro Selva
fuente
fuente
apply()
hará asincrónicamente las E / S de disco mientrascommit()
esté sincronizado. Entonces realmente no deberías llamarcommit()
desde el hilo de la interfaz de usuario.apply()
gana el último llamado . Por lo tanto, puede usarloapply()
en lugar decommit()
forma segura si se asegura de que solo su aplicación esté utilizando un SharedPreferences.Editor.commit()
?Respuestas:
apply()
se agregó en 2.3, se compromete sin devolver un valor booleano que indica éxito o falla.commit()
devuelve verdadero si el guardado funciona, falso de lo 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 aplicar es más rápido ya que es asíncrono.http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply ()
fuente
tl; dr:
commit()
escribe los datos sincrónicamente (bloqueando el hilo desde el que se llama). Luego le informa sobre el éxito de la operación.apply()
programa los datos para que se escriban de forma asincrónica . No le informa sobre el éxito de la operación.apply()
e inmediatamente lee a través de cualquier método getX, ¡se devolverá el nuevo valor!apply()
en algún momento y todavía se está ejecutando, cualquier llamada acommit()
se bloqueará hasta que todas las llamadas aplicadas pasadas y la llamada de confirmación actual hayan finalizado.Más información detallada de SharedPreferences. Documentación del editor :
fuente
apply()
es asíncrona y que las escrituras pendientes bloquean las llamadas futurascommit()
.Estoy experimentando algunos problemas al usar apply () en lugar de commit (). Como se indicó anteriormente en otras respuestas, el apply () es asíncrono. Tengo el problema de que los cambios formados en una preferencia de "conjunto de cadenas" nunca se escriben en la memoria persistente.
Ocurre si "fuerza la detención" del programa o, en la ROM que he instalado en mi dispositivo con Android 4.1, cuando el sistema elimina el proceso debido a necesidades de memoria.
Recomiendo usar "commit ()" en lugar de "apply ()" si quieres que tus preferencias estén activas.
fuente
Utilice apply ().
Escribe los cambios en la RAM de inmediato y espera y lo escribe en el almacenamiento interno (el archivo de preferencias real) después. Commit escribe los cambios sincrónicamente y directamente en el archivo.
fuente
commit()
es sincrónico,apply()
es asincrónicoapply()
Es una función nula.commit()
devuelve verdadero si los nuevos valores se escribieron correctamente en el almacenamiento persistente.apply()
garantías completas antes de cambiar de estado, no necesita preocuparse por los ciclos de vida de los componentes de AndroidSi no usa el valor devuelto por
commit()
y está usando elcommit()
hilo principal, use enapply()
lugar decommit()
fuente
Los documentos dan una muy buena explicación de la diferencia entre
apply()
ycommit()
:fuente
De javadoc:
fuente
Podríamos estar confundidos por esos dos términos, cuando estamos usando SharedPreference. Básicamente son probablemente los mismos, así que aclaremos las diferencias de commit () y apply ().
apply()
se compromete sin devolver un valor booleano que indica éxito o fracaso.commit(
) devuelve verdadero si el guardado funciona, falso de lo contrario.apply()
es más rápido.commit()
es mas lentoapply()
: Asíncronocommit()
: Sincrónicoapply()
: atómicocommit()
: atómicoapply()
: Nocommit()
: Sífuente
apply()
"más rápido" quecommit()
? Básicamente representan una misma tarea que se colocaría en Looper del hilo.commit()
coloca esa tarea en el bucle principal mientras laapply()
toma en segundo plano, manteniendo así al bucle principal libre de tareas de E / S de disco.