2012-04-17 4 views
17
aktualisiert

Ich versuche, die Werte von SharedPreferences zu aktualisieren, hier ist mein Code:SharedPreferences Wert wird nicht

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

Das Problem ist, dass, wenn ich diese Werte am Zugriff auf nicht aktualisierten Werte zurückgibt, es gibt mir einen Wert von SharedPreferences.

Aber wenn ich die Daten in XML Datei bestätige, werden die Daten in diesem aktualisiert.

Und nach dem Neustart meiner Anwendung bekomme ich diese aktualisierten Werte. Daher muss ich die Anwendung neu starten, um aktualisierte Werte zu erhalten.
Also, wie diese aktualisierten Werte zu erhalten, sobald es sich ändert?

Vielen Dank im Voraus

Hier ist meine ganze Code:

@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

Code anzeigen, um den Wert zu erhalten. –

+0

Können Sie anderen Code anzeigen, der korrekte Werte angibt? Und woher aktualisieren Sie die Werte? Wenn Sie Werte erhalten, bevor Sie gemeinsame Einstellungen aktualisieren, werden auf jeden Fall alte Werte angezeigt. –

Antwort

62

Statt edit.commit(); verwenden, sollten Sie edit.apply(); verwenden. Übernehmen aktualisiert das Präferenzobjekt sofort und speichert die neuen Werte asynchron, so dass Sie die neuesten Werte lesen können.


begehen()

Commit Ihre Einstellungen aus diesem Editor wechselt zurück zu den SharedPreferences Objekt es Bearbeitung ist. Dies führt automatisch die angeforderten Änderungen durch und ersetzt, was derzeit in den SharedPreferences ist.

Beachten Sie, dass, wenn zwei Editoren Einstellungen gleichzeitig ändern, der letzte zu commit Commit gewinnt.

Wenn Ihnen der Rückgabewert egal ist und Sie diesen aus Hauptthread Ihrer Anwendung verwenden, sollten Sie stattdessen apply() verwenden.

gelten()

Commit Ihre Einstellungen aus diesem Editor wechselt zurück zu den SharedPreferences Objekt es Bearbeitung ist. Dies führt automatisch die angeforderten Änderungen durch und ersetzt, was derzeit in den SharedPreferences ist.

Beachten Sie, dass, wenn zwei Editoren die Einstellungen gleichzeitig ändern, die letzte Anwendung, die angewendet wird, gewinnt.

Im Gegensatz zu begehen(), die seine Präferenzen, um persistente Speicher schreibt synchron, apply() verpflichtet sich, seine Änderungen an der In-Memory- SharedPreferences sofort, sondern beginnt ein asynchroner zu Platte zu begehen und Sie werden nicht von benachrichtigt irgendwelche Fehler. Wenn ein anderer Editor auf dieser SharedPreferences ist eine regelmäßige() begehen, während eine Anwendung() ist noch aussteht, die commit() blockiert, bis alle Asynchron-Commits ebenso abgeschlossen wie die sich dazu verpflichten. Wenn SharedPreferences-Instanzen Singletons innerhalb eines Prozesses sind, ist es sicher, jede Instanz von commit() durch apply() zu ersetzen, wenn Sie bereits den Rückgabewert ignorierten.

Sie müssen sich keine Gedanken über Android-Komponentenlebenszyklen und ihre Interaktion mit apply() Schreiben auf Festplatte machen. Das Framework stellt sicher, dass In-Flight-Disk schreibt von apply() abgeschlossen vor dem Umschalten von Zuständen.

+1

Während apply() eine gute Alternative ist, führt es das Problem ein, dass du deine min API auf 9 (2.3 Gingerbread) setzen musst, was laut den aktuellen Statistiken ungefähr 30% aller Android Geräte ausmacht.Ich fand, dass commit() so lange funktioniert, wie Sie das nächste Mal, wenn Sie es überprüfen, eine neue Instanz des SharedPreferences-Objekts erstellen, die keine schwierige Code-Änderung sein kann – Jag

+0

Wenn 'apply()' asynchron aufgerufen wird, warum lese ich der neueste Wert, wenn dieser Code? https://gist.github.com/anonymous/62637e408baf273a7bc43754422c3739 –

+0

@MaksimDmitriev "apply()" überträgt seine Änderungen sofort in die SharedPreferences im Arbeitsspeicher, startet jedoch eine asynchrone Festschreibung auf der Festplatte und Sie werden nicht über Fehler informiert. " Wenn Sie unmittelbar nach dem Eingeben eines Werts aus den freigegebenen Einstellungen lesen und es anwenden, wird der Wert aus dem Speicher und nicht aus dem Speicher angezeigt. – cuddlecheek

1

wie diese versuchen,

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

es hoffen, dass Sie helfen ..

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


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

Versuchen Sie diesen Code:

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

Nun, auch wenn meine Antwort 3 Jahre nach der Frage kam, hoffe ich, dass es helfen wird. Das Problem scheint nicht von commit oder apply zu kommen, sondern von der Code-Struktur.

Lassen Sie uns erklären: Auf einem Smartphone, führen Sie eine APP, aber Sie beenden nicht die APP, wie wir es auf Computern tun. Dies bedeutet, wenn Sie zurück zum Menü des Smartphones kommen, ist die APP immer noch "läuft". Wenn Sie erneut auf das APP-Symbol klicken, führen Sie die APP nicht erneut aus, sondern aktivieren sie nur. In juned Code können wir sehen, ruft er getDefaultSharedPreferences innerhalb seiner Create-Funktion.

Also ruft er getDefaultSharedPreferences auf, wenn er das erste Mal die APP ausführt. Aber wenn er die APP auf den Hintergrund setzt und dann die APP weckt, wird der Anruf nicht ausgeführt.

Ich hatte das gleiche Problem: Ich überprüfe, ob ich SharedPreference für meine APP habe. Wenn nicht, fordere ich ein Formular auf, um dem Benutzer einen Wert zu stellen. Wenn ja, überprüfe ich das Datum der Einstellungen. Wenn zu alt, fordere ich das Formular an. Nach dem Formular speichere ich die Einstellungen mit dem aktuellen Datum. Was ich festgestellt habe, ist, dass der Test über die Existenz der SharedPreference (die an der gleichen Stelle wie die von juned gesetzt wurde) nur beim ersten Start der APP gemacht wurde, aber nicht, wenn ich die APP aufwecke. Dies bedeutet, dass ich den Zeitlimit meiner SharedPreferences nicht überprüfen konnte!

Wie löst man das? Fügen Sie einfach:

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

Dieser Code wird auf den ersten Lauf des APP, sondern auch jedes Mal, wenn der Benutzer wach sie aufgerufen werden.