1
votes

Les préférences partagées n'enregistreront pas les données

Je suis nouveau sur Android, et un peu sur Java (ne pas demander)

Je veux utiliser les préférences partagées, et jusqu'à ce jour, tout a bien fonctionné, mais dans mon nouveau projet, les préférences partagées ont gagné Je ne sauvegarde pas les données.

Dans ma méthode onCreate, j'ai le code suivant:

@Override
public void onDestroy(){
    super.onDestroy();
    editor.putInt(TESTLEVEL, level);
    editor.putFloat(TESTEPFLOAT, ep);
    editor.putFloat(TESTCURRENTEPFLOAT, currentEP);
    editor.apply();
}

dans ma méthode onDestroy:

    preferences = this.getSharedPreferences(KEY, MODE_PRIVATE);
    editor = preferences.edit();
    preferences.getFloat(TESTEPFLOAT, 0);
    preferences.getFloat(TESTCURRENTEPFLOAT, 0);
    preferences.getInt(TESTLEVEL, 1);

Je ne sais pas où est le problème et j'espère que quelqu'un pourra m'aider


4 commentaires

vous devez engager votre éditeur après la mise à jour des données.


@SushilKumar: apply () fonctionne comme commit (), uniquement asynchrone.


ajouter ces listes dans onStop pas dans ondestroy


@ Rohit5k2 je n'ai pas vu s'appliquer. Mon erreur.


3 Réponses :


4
votes

N'utilisez pas onDestroy (). Il n'y a aucune garantie qu'il sera appelé. Si vous mettez un point d'arrêt dans cette méthode, je suppose qu'il n'est pas appelé quand vous pensez que c'est le cas.


4 commentaires

Je suis d'accord, c'est peut-être aussi un problème.


Comment ne garantit-on pas que onDestroy est appelé? Je pense que onStop () n'est pas toujours appelé mais onDestroy () doit être appelé lorsque l'activité est détruite?


onPause est toujours appelé. C'est le meilleur endroit pour ce travail


La documentation dit littéralement de ne pas utiliser onDestroy () pour enregistrer des données: developer.android.com/reference/android/app/…



1
votes

changez comme suit:

@Override
    protected void onPause() {
        super.onPause();
    preferences = this.getSharedPreferences(KEY, MODE_PRIVATE);
        editor = preferences.edit();
        editor.putInt(TESTLEVEL, level);
        editor.putFloat(TESTEPFLOAT, ep);
        editor.putFloat(TESTCURRENTEPFLOAT, currentEP);
        editor.apply();
}

pour enregistrer vos données:

preferences = this.getSharedPreferences(KEY, MODE_PRIVATE);
preferences.getFloat(TESTEPFLOAT, 0);
preferences.getFloat(TESTCURRENTEPFLOAT, 0);
preferences.getInt(TESTLEVEL, 1);

ou utilisez editor.commit (); pour enregistrer les données immédiatement


3 commentaires

En quoi est-ce différent du code d'OP? Absolument aucun changement.


La différence est que lors de la lecture, vous n'avez pas besoin de «l'éditeur» et lors de la sauvegarde, vous pouvez utiliser «commit» pour enregistrer les données immédiatement et sera appelé onPause


ce n'est même pas utilisé. Probablement juste une initialisation.



0
votes

Tout comme @Gavin Wright l'a dit, onDestroy n'est pas appelé à chaque fois. Déplacez le code vers onPause () . onPause () est garanti d'être appelé chaque fois que vous quittez votre activité.

@Override
public void onPause(){
    super.onPause();
    editor.putInt(TESTLEVEL, level);
    editor.putFloat(TESTEPFLOAT, ep);
    editor.putFloat(TESTCURRENTEPFLOAT, currentEP);
    editor.apply();
}


0 commentaires