繁体   English   中英

Android-重新启动应用程序时未保存SharedPreferences

[英]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文档)

在编辑器中标记以从首选项中删除所有值

无需调用applycommit一个就可以了:

谷歌文档:

与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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM