sirve - shared preferences android studio ejemplo
¿Cuál es la diferencia entre commit() y apply() en la preferencia compartida? (7)
Estoy usando la preferencia compartida en mi aplicación de Android. Estoy usando los métodos 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, el método apply()
muestra un error. Entonces, ¿cuál es la diferencia entre estos dos? Y al usar solo commit()
¿puedo almacenar el valor de preferencia sin ningún problema?
De javadoc:
A diferencia de commit (), que escribe sus preferencias en el almacenamiento persistente de forma sincrónica, apply () confirma sus cambios en las SharedPreferences en la memoria de inmediato, pero inicia una confirmación asíncrona en el disco y no se le notificará ningún error. Si otro editor en este SharedPreferences hace un commit regular () mientras que un> apply () aún está pendiente, el commit () se bloqueará hasta que se completen todos los commit asíncronos así como el commit mismo
Estoy experimentando algunos problemas al utilizar apply () en lugar de commit (). Como se indicó anteriormente en otras respuestas, el apply () es asíncrono. Estoy teniendo 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 instalé en mi dispositivo con Android 4.1, cuando el proceso muere en el proceso debido a las necesidades de memoria.
Recomiendo usar "commit ()" en lugar de "apply ()" si desea que sus preferencias estén vivas.
Los documentos dan una explicación bastante buena de la diferencia entre SharedPreferences.Editor y commit()
:
A diferencia de
commit()
, que escribe sus preferencias en el almacenamiento persistente de forma sincrónica,apply()
confirma sus cambios en lasSharedPreferences
en la memoria de inmediato, pero inicia una confirmación asíncrona en el disco y no se le notificará ningún error. Si otro editor en esteSharedPreferences
hace uncommit()
regularcommit()
mientras unapply()
aún está pendiente, elcommit()
se bloqueará hasta que se completen todos los commit asíncronos, así como el commit mismo. ComoSharedPreferences
instancias deSharedPreferences
son singletons dentro de un proceso, es seguro reemplazar cualquier instancia decommit()
conapply()
si ya estaba ignorando el valor de retorno.
Utilice apply ().
Escribe los cambios en la RAM inmediatamente y espera y los escribe en el almacenamiento interno (el archivo de preferencia real) después. Confirmar escribe los cambios de forma síncrona y directamente en el archivo.
apply()
se agregó en 2.3, se compromete sin devolver un valor booleano que indique el éxito o el fracaso.
commit()
devuelve true si el guardado funciona, falso de lo contrario.
apply()
se agregó a medida que 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()
tl; dr:
-
commit()
escribe los datos de forma síncrona (bloqueando el subproceso desde el que se llama). A continuación, le informa sobre el éxito de la operación. -
apply()
programa los datos para que se escriban de forma asíncrona . No le informa sobre el éxito de la operación. - Si guarda con
apply()
y lee inmediatamente mediante cualquier método getX, ¡se devolverá el nuevo valor! - Si llamó a
apply()
en algún momento y aún se está ejecutando, todas las llamadas acommit()
se bloquearán hasta que todas las llamadas de apply pasadas y la llamada de confirmación actual finalicen.
Más información en profundidad 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 las SharedPreferences en la memoria de inmediato, pero inicia una confirmación asíncrona en el disco y no se le notificará ningún error . Si otro editor en este SharedPreferences hace un commit regular () mientras un apply () aún está pendiente, el commit () se bloqueará hasta que se completen todos los commit asíncronos, así como el commit mismo.
Como las instancias de SharedPreferences son singletons 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 anteriormente lo implementó y ahora está obteniendo errores sobre faltar a apply (), simplemente puede llamar a commit () desde apply ().
commit()
es síncrono,apply()
es asíncronoapply()
es una función vacía.commit()
devuelve true si los nuevos valores se escribieron correctamente en el almacenamiento persistente.apply()
garantiza que está completo antes de cambiar de estado, no necesita preocuparse por los ciclos de vida de los componentes de Android
Si no usa el valor devuelto por commit()
y está usando commit()
del hilo principal, use apply()
lugar de commit()