[英]Android - SharedPreferences aren't saving when I restart the app
我正在使用Android Studio进行游戏,重新加载应用程序时未保存用于高分的我的SharedPreferences。 在应用程序中,它工作正常,但重新启动会将高分重新发送回默认值(0)。
在MainActivity中设置我的SharedPreferences:
SharedPreferences settings = getSharedPreferences("GAME_DATA", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
if(currentTopic == 4){
if(settings.getInt("HIGHSCORE", 0) < Math.round(scoreTotal)){
editor.clear();
editor.putInt("HIGHSCORE", Math.round(scoreTotal));
editor.apply();
editor.commit();
}
Intent homeIntent = new Intent(MainActivity.this, HomeActivity.class);
homeIntent.putExtra("Score", Integer.toString(Math.round(scoreTotal)));
startActivity(homeIntent);
editor.commit();
finish();
为了澄清,该代码确实将其放入if语句中。 “ scoreTotal”是我要保存的最高分。
在HomeActivity中获取我的SharedPreferences:
SharedPreferences settings = getSharedPreferences("GAME_DATA", Context.MODE_PRIVATE);
int highscore = settings.getInt("HIGHSCORE", 0);
Log.i("highscore", String.valueOf(highscore));
TextView tv_highscore = findViewById(R.id.tv_highscore);
tv_highscore.setText("Highscore: "+String.valueOf(highscore));
我哪里出问题了?
如果我忘记包含某些内容,请告诉我。 我已经从以前的StackOverflow帖子中尝试了很多东西,但是没有用。 提前致谢。
编辑:澄清一下,我的问题来自无法在该活动中执行SharedPreferences,然后从另一个活动中获取它们。 我使用了额外的意图消息,并在HomeActivity中完成了所有SharedPreferences并成功了。 希望这可以帮助一些人。
尝试以下方法:
SharedPreferences settings = getSharedPreferences("GAME_DATA", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
long score = Math.round(scoreTotal);
if(currentTopic == 4){
if(settings.getInt("HIGHSCORE", 0) < score){
editor.putInt("HIGHSCORE", score);
editor.apply();
}
Intent homeIntent = new Intent(MainActivity.this, HomeActivity.class);
homeIntent.putExtra("Score", Integer.toString(score));
startActivity(homeIntent);
finish();
我怀疑您不需要(甚至是真的想要)调用editor.clear();
因为(根据Google文档)
在编辑器中标记以从首选项中删除所有值
。
无需调用apply
并commit
一个就可以了:
谷歌文档:
与commit()将其首选项同步写到持久性存储中的方式不同,apply()立即将其更改提交到内存中的SharedPreferences,但是将异步提交到磁盘,并且不会收到任何故障通知。 如果此SharedPreferences上的另一个编辑器在apply()仍未完成的情况下执行常规commit(),则commit()将阻塞,直到所有异步提交以及提交本身都完成为止。
您可以像这样创建一个用于保存数据的类
public class GameData {
private SharedPreferences preferences;
private SharedPreferences.Editor editor;
private Context context;
private int PRIVATE_MODE = 0;
private static final String PREF_NAME = "GAME_DATA";
public GameData(Context context){
this.context = context;
preferences = context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
editor = preferences.edit();
}
public void set(String key, boolean value){
editor.putBoolean(key, value);
editor.commit();
}
public void set(String key, String value){
editor.putString(key, value);
editor.commit();
}
public void set(String key, long value){
editor.putLong(key, value);
editor.commit();
}
public void set(String key, int value){
editor.putInt(key, value);
editor.commit();
}
public void set(String key, float value){
editor.putFloat(key, value);
editor.commit();
}
public float get(String key, float defaultValue){
return preferences.getFloat(key, defaultValue);
}
public int get(String key, int defaultValue){
return preferences.getInt(key, defaultValue);
}
public long get(String key, long defaultValue){
return preferences.getLong(key, defaultValue);
}
public String get(String key, String defaultValue){
return preferences.getString(key, defaultValue);
}
public boolean get(String key, boolean defaultValue){
return preferences.getBoolean(key, defaultValue);
}
}
然后调用课程来设置/获取数据
private GameData gamedata;
gamedata = new GameData(getApplicationContext());
gamedata.set("HIGHSCORE",score); // FOR SET THE HIGHSCORE
int highscore = gamedata.get("HIGHSCORE", 0); // FOR GET THE HIGHSCORE
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.