web-dev-qa-db-fra.com

La valeur SharedPreferences n'est pas mise à jour

J'essaie de mettre à jour les valeurs de SharedPreferences, voici mon code:

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

Le problème est que lorsque j'accède à ces valeurs, il ne renvoie pas de valeurs mises à jour, il me donne une valeur de SharedPreferences.

Mais quand je confirme les données dans le fichier XML , les données sont mises à jour.

Et après avoir redémarré mon application, j'obtiens ces valeurs mises à jour. Il me faut donc redémarrer l'application pour obtenir des valeurs mises à jour.
Alors, comment obtenir ces valeurs mises à jour une fois qu'elles ont changé?

Merci d'avance

Voici mon code entier:

@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();
}
23
Juned

Au lieu d'utiliser edit.commit();, vous devez utiliser edit.apply();. Appliquer mettra à jour l'objet de préférence instantanément et enregistrera les nouvelles valeurs de manière asynchrone , vous permettant ainsi de lire les dernières valeurs.


commit ()

Validez vos modifications de préférences depuis cet éditeur vers l'objet SharedPreferences qu'il modifie. Cela effectue atomiquement les modifications demandées, remplaçant tout ce qui se trouve actuellement dans les SharedPreferences.

Notez que lorsque deux éditeurs modifient les préférences en même temps, le dernier à appeler la validation l'emporte.

Si vous ne vous souciez pas de la valeur de retour et que vous l'utilisez à partir du thread principal de votre application, envisagez plutôt d'utiliser apply ().

appliquer ()

Validez vos modifications de préférences depuis cet éditeur vers l'objet SharedPreferences qu'il modifie. Cela effectue atomiquement les modifications demandées, remplaçant tout ce qui se trouve actuellement dans les SharedPreferences.

Notez que lorsque deux éditeurs modifient les préférences en même temps, le dernier à appeler appliquer gagne.

Contrairement à commit (), qui écrit ses préférences sur le stockage persistant de manière synchrone, apply () valide immédiatement ses modifications dans les SharedPreferences en mémoire, mais démarre une validation asynchrone sur le disque et vous ne serez pas informé des échecs. Si un autre éditeur de ce SharedPreferences effectue un commit () normal alors qu'un apply () est toujours en attente, le commit () se bloquera jusqu'à ce que tous les commit asynchrones soient terminés ainsi que le commit lui-même.

Comme les instances SharedPreferences sont des singletons dans un processus, il est prudent de remplacer toute instance de commit () par apply () si vous ignoriez déjà la valeur de retour.

Vous n'avez pas à vous soucier des cycles de vie des composants Android Android et de leur interaction avec l'écriture apply () sur le disque. Le framework s'assure que les écritures du disque en vol à partir de apply () sont terminées avant de changer d'état.

70
waqaslam

Eh bien, même si ma réponse est venue 3 ans après la question, j'espère que cela vous aidera. Le problème ne semble pas provenir de la validation ou de l'application, mais de la structure du code.

Expliquons: sur un smartphone, vous exécutez une APP mais vous ne quittez pas l'APP comme nous le faisons sur les ordinateurs. Cela signifie que lorsque vous revenez au menu du smartphone, l'application est toujours en cours d'exécution. Lorsque vous "cliquez" à nouveau sur l'icône de l'APP, vous ne réexécutez pas l'APP mais la réveillez simplement. En code juned, nous pouvons voir qu'il appelle getDefaultSharedPreferences dans sa fonction Create.

Il appelle donc getDefaultSharedPreferences lors de la première exécution de l'APP. Mais lorsqu'il met l'APP en arrière-plan, puis réveille l'APP, l'appel n'est pas fait.

J'ai eu le même problème: je vérifie si j'ai SharedPreference pour mon APP. Sinon, j'invite un formulaire à demander une valeur à l'utilisateur. Si oui, je vérifie la date des préférences. S'il est trop vieux, j'invite le formulaire. Après le formulaire, j'enregistre les préférences avec la date du jour. Ce que j'ai remarqué, c'est que le test sur l'existence de SharedPreference (qui a été défini au même emplacement que celui de juned) n'a été effectué qu'au premier lancement de l'APP, mais pas lorsque je réveille l'APP. Cela signifie que je n'ai pas pu vérifier la limite de temps de mes SharedPreferences!

Comment résoudre ça? Il suffit d'ajouter:

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

Ce code sera appelé lors de la première exécution de l'APP mais aussi à chaque fois que l'utilisateur le réveillera.

1
Peter

j'espère que cela vous aidera ..

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


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

Essayez ce 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();
1
Shankar Agarwal

Essayez comme ça,

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