2012-04-17 22 views
17

Estoy tratando de actualizar los valores de SharedPreferences, aquí está mi código:SharedPreferences no se actualiza

edit = PreferenceManager.getDefaultSharedPreferences(this).edit(); 
edit.putString(Settings.PREF_USERNAME+"",txtuser); 
edit.putString(Settings.PREF_PASSWORD+"",txtpass); 
edit.commit();" 

El problema es que cuando yo soy el acceso a estos valores, no está regresando valores actualizados, me da un valor de SharedPreferences.

Pero cuando estoy confirmando los datos en el archivo XML, los datos se actualizan en eso.

Y después de reiniciar mi aplicación obtengo los valores actualizados. Por lo tanto, me obliga a reiniciar la aplicación para obtener los valores actualizados.
Entonces, ¿cómo obtener esos valores actualizados una vez que cambie?

Gracias de antemano

Aquí está toda mi código:

@Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 
     ctx=this; 

      status=PreferenceManager.getDefaultSharedPreferences(this).getString(Settings.PREF_STATUS, Settings.DEFAULT_STATUS);// get old value 
     submit.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

        on(ctx,true);// function will call and value is updated 

       } 
      }});  

    status=PreferenceManager.getDefaultSharedPreferences(this).getString(Settings.PREF_STATUS, Settings.DEFAULT_STATUS);// this should give me a updated value but gives old value 

    } 
    public static boolean on(Context context) { 
     return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(Settings.PREF_ON, Settings.DEFAULT_ON); 
    } 

    public static void on(Context context,boolean on) { 
      if (on) Receiver.engine(context).isRegistered(); // 
     } 




**********in reciver file*********** 
public void isRegistered) { 
     Editor edit = PreferenceManager.getDefaultSharedPreferences(Receiver.mContext).edit(); 
     edit.putString(Settings.PREF_STATUS+"","0"); 
     edit.commit(); 
} 
+1

muestra el código para obtener el valor. –

+0

¿Puede mostrar otro código que proporcione los valores correctos? ¿Y desde dónde estás actualizando los valores? Si obtiene valores antes de actualizar las preferencias compartidas, definitivamente dará valores antiguos. –

Respuesta

62

En lugar de utilizar edit.commit();, se debe utilizar edit.apply();. Aplicar actualizará el objeto de preferencia al instante y guardará los nuevos valores de forma asíncrona, lo que le permite leer los últimos valores.


comprometerse()

confirmar sus preferencias cambia de nuevo de este editor para los SharedPreferences objeto es la edición. Esto realiza atómicamente las modificaciones solicitadas , reemplazando lo que se encuentre actualmente en las SharedPreferences.

Tenga en cuenta que cuando dos editores modifican las preferencias al mismo tiempo, gana la última invocación.

Si no le importa el valor devuelto y lo está usando desde el el hilo principal de la aplicación, considere usar apply().

aplicar()

confirmar sus preferencias cambia de nuevo de este editor para los SharedPreferences objeto es la edición. Esto realiza atómicamente las modificaciones solicitadas , reemplazando lo que se encuentre actualmente en las SharedPreferences.

Tenga en cuenta que cuando dos editores modifican las preferencias al mismo tiempo, gana la última llamada.

A diferencia de commit(), que escribe sus preferencias a la persistencia de almacenamiento de forma sincrónica, aplicar() sobre sus cambios a la in-memory SharedPreferences inmediatamente, sino que pone en marcha un asíncrono se comprometen a disco y no será notificado de cualquier falla Si otro editor en esta SharedPreferences realiza una confirmación regular() mientras que una solicitud() es aún pendiente, la confirmación() se bloqueará hasta que todas las confirmaciones asincrónicas estén completas y la confirmación misma.

Como las instancias de SharedPreferences son singletons dentro de un proceso, es seguro para reemplazar cualquier instancia de commit() con apply() si usted estaba ignorando el valor de retorno.

No necesita preocuparse por los ciclos de vida de los componentes Android y su interacción con la escritura de apply() en el disco. El framework se asegura de que escribe en disco desde apply() antes de cambiar de estado.

+1

Si bien apply() es una buena alternativa, introduce el problema de tener que establecer tu min API en 9 (2.3 Gingerbread) que, de acuerdo con las estadísticas actuales, elimina aproximadamente el 30% de todos los dispositivos Android.Descubrí que commit() funciona siempre y cuando la próxima vez que lo verifique esté creando una nueva instancia del objeto SharedPreferences que podría no ser un cambio de código difícil – Jag

+0

si 'apply()' se llama de forma asíncrona, ¿por qué leo el valor más nuevo si este código? https://gist.github.com/anonymous/62637e408baf273a7bc43754422c3739 –

+0

@MaksimDmitriev "apply() confirma sus cambios en las Preferencias Compartidas en la memoria de inmediato, pero inicia una confirmación asincrónica en el disco y no se le notificará ninguna falla". Cuando lee de las preferencias compartidas inmediatamente después de poner un valor y aplicarlo, le dice el valor de la memoria y no del almacenamiento. – cuddlecheek

1

Trate de este tipo,

public SharedPreferences prefs; 
SharedPreferences.Editor editor = prefs.edit(); 
editor.putString(Settings.PREF_USERNAME+"", txtuser); 
editor.putString(Settings.PREF_PASSWORD+"", entered_name); 
editor.commit();  
1

esperemos que le ayudará a ..

SharedPreferences mypref = PreferenceManager.getDefaultSharedPreferences(this); 
SharedPreferences.Editor prefsEditr = mypref.edit(); 
prefsEditr.putString("Userid", UserId); 
prefsEditr.commit(); 


String task1 = mypref.getString("Userid", ""); 
1

probar este código:

SharedPreferences edit = PreferenceManager.getDefaultSharedPreferences(this); 
SharedPreferences.Editor editor1 = edit.edit(); 
editor.putString(Settings.PREF_USERNAME + "", txtuser); 
editor.putString(Settings.PREF_PASSWORD + "", entered_name); 
editor.commit(); 
0

Bueno, incluso si mi respuesta llegó 3 años después de la pregunta, espero que ayude. El problema no parece provenir de commit o apply, sino de la estructura del código.

Expliquemos: en un teléfono inteligente, ejecuta una APLICACIÓN pero no abandona la APLICACIÓN como lo hacemos en las computadoras. Esto significa que cuando vuelves al menú del teléfono inteligente, la aplicación todavía está "en funcionamiento". Cuando haces "clic" nuevamente en el ícono de la APLICACIÓN, no vuelves a ejecutar la APLICACIÓN, sino que simplemente la despiertas. En el código juned, podemos ver que llama a getDefaultSharedPreferences dentro de su función Create.

Llama a getDefaultSharedPreferences cuando ejecuta la aplicación por primera vez. Pero cuando establece la aplicación en segundo plano y luego despierta la aplicación, la llamada no se realiza.

He tenido el mismo problema: Compruebo si tengo SharedPreference para mi APLICACIÓN. Si no, solicito un formulario para pedirle valor al usuario. En caso afirmativo, verifico la fecha de las preferencias. Si es demasiado viejo, solicito el formulario. Después del formulario, guardo las preferencias con la fecha actual. Lo que noté es que la prueba sobre la existencia de SharedPreference (que se estableció en la misma ubicación que la de juned) se hizo solo en la primera ejecución de la APLICACIÓN, pero no cuando lo activé. ¡Esto significa que no pude verificar el límite de tiempo de mis SharedPreferences!

¿Cómo resolver eso? Sólo añadir:

  @Override 
      public void onResume(){ 
      super.onResume(); 
     // And put the SharedPreferences test here 
      } 

Este código se llamará a la primera carrera de la APP, sino también cada vez que el usuario se despierta.

Cuestiones relacionadas