【问题标题】:Shared Preferences won't save the data共享首选项不会保存数据
【发布时间】:2019-08-02 20:07:29
【问题描述】:

我是 Android 新手,对 Java 有点了解(不要问)

我想使用共享首选项,直到今天一切正常,但在我的新项目中,共享首选项不会保存数据。

在我的 onCreate 方法中,我有以下代码:

    preferences = this.getSharedPreferences(KEY, MODE_PRIVATE);
    editor = preferences.edit();
    preferences.getFloat(TESTEPFLOAT, 0);
    preferences.getFloat(TESTCURRENTEPFLOAT, 0);
    preferences.getInt(TESTLEVEL, 1);

在我的 onDestroy 方法中:

@Override
public void onDestroy(){
    super.onDestroy();
    editor.putInt(TESTLEVEL, level);
    editor.putFloat(TESTEPFLOAT, ep);
    editor.putFloat(TESTCURRENTEPFLOAT, currentEP);
    editor.apply();
}

不知道问题出在哪里,希望有人能帮帮我

【问题讨论】:

  • 更新数据后必须提交编辑器。
  • @SushilKumar:apply() 像 commit() 一样工作,只是异步。
  • 将这些列表添加到 onStop 而不是 ondestroy
  • @Rohit5k2 我没有看到适用。我的错。

标签: java android sharedpreferences


【解决方案1】:

正如@Gavin Wright 所说,onDestroy 不要每次都被调用。将代码移至onPause()onPause() 保证在您每次离开活动时都会被调用。

@Override
public void onPause(){
    super.onPause();
    editor.putInt(TESTLEVEL, level);
    editor.putFloat(TESTEPFLOAT, ep);
    editor.putFloat(TESTCURRENTEPFLOAT, currentEP);
    editor.apply();
}

【讨论】:

    【解决方案2】:

    改成这样:

    preferences = this.getSharedPreferences(KEY, MODE_PRIVATE);
    preferences.getFloat(TESTEPFLOAT, 0);
    preferences.getFloat(TESTCURRENTEPFLOAT, 0);
    preferences.getInt(TESTLEVEL, 1);
    

    保存您的数据:

    @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();
    }
    

    或使用editor.commit();立即保存数据

    【讨论】:

    • 它与 OP 的代码有何不同?完全没有变化。
    • 区别在于读取时不需要“编辑器”,保存时可以使用“提交”立即保存数据并调用onPause
    • 甚至没有使用。可能只是一个初始化。
    【解决方案3】:

    不要使用 onDestroy()。不能保证它会被调用。如果你在那个方法中设置一个断点,我猜你认为它不会被调用。

    【讨论】:

    • 我同意,这也可能是个问题。
    • 怎么不保证 onDestroy 被调用?我认为 onStop() 并不总是被调用,但 onDestroy() 应该在活动被销毁时调用?
    • onPause 总是被调用。这是最适合这份工作的地方
    • 文档字面上说不要使用 onDestroy() 来保存数据:developer.android.com/reference/android/app/…
    猜你喜欢
    • 2019-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    • 1970-01-01
    • 2012-03-29
    相关资源
    最近更新 更多