我正在使用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做一个常规commit(),而apply()是
  仍然未完成,commit()将阻塞,直到所有异步提交都
  完成以及提交本身。

10-07 19:14
查看更多