【问题标题】:Android - SharedPreferences aren't saving when I restart the appAndroid - 当我重新启动应用程序时,SharedPreferences 没有保存
【发布时间】:2018-04-10 17:59:06
【问题描述】:

我正在使用 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 并且它起作用了。希望这能够帮助一些人。

【问题讨论】:

  • 你为什么叫“editor.commit();”在“完成()”之前?如果if 语句失败,您可能不会进行任何编辑。如果没有失败,甚至可以再次调用它
  • 您不是已经将分数作为附加项传递给 HomeActivity 了吗?为什么不使用这些数据?此外,第二次 commit() 调用是无用的,就像@Barns 评论的那样

标签: java android android-studio


【解决方案1】:

试试这个:

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();,因为这(根据谷歌文档)会

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

.

而且无需调用applycommit 即可:

谷歌文档:

与 commit() 不同,commit() 将其偏好写入持久化 同步存储,apply() 将其更改提交到内存中 SharedPreferences 立即但开始异步提交 磁盘,您将不会收到任何故障通知。如果另一个编辑 此 SharedPreferences 执行常规 commit() 而 apply() 是 仍然未完成,commit() 将阻塞,直到所有异步提交都完成 完成以及提交本身。

【讨论】:

  • 已经完成了你所说的一切,但仍然没有保存分数。我从 Android Studio 运行应用程序,所以我尝试构建并传输到设备,我遇到了同样的问题。还有什么想法吗?
  • @LouisEvans :: 您能否扩展您发布的代码以包括您调用保存SharedPreferences的操作的方法以及您要访问SharedPreferences的方法. (例如onCreateonClick?其中Activity)这样我就可以了解您的应用程序的逻辑流程。不用担心!我们会解决这个问题的!
  • 我已经花了很多时间试图解决这个问题,但事实证明,由于某种原因,我根本无法从该活动中做到这一点 - 我使用了 Intent 额外消息,并做了所有我的 HomeActivity 中的 SharedPreferences 并且它有效。感谢您的帮助!
【解决方案2】:

你可以创建一个这样的类来保存数据

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-10
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 2021-01-31
    相关资源
    最近更新 更多