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
3 Réponses :
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.
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/…
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
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.
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(); }
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.