没有立即获得共享偏好的价值

时间:2017-05-24 06:12:11

标签: android android-fragments android-activity android-sharedpreferences

我将数据存储在共享首选项中

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("menu_bar","abcd");
editor.apply(); 

我正在通过

从片段中的共享首选项中获取数据
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
String name = preferences.getString("menu_bar","");
if(!name.equalsIgnoreCase("")){
Toast.makeText(getActivity(), name, Toast.LENGTH_SHORT).show();

当应用程序从堆栈中删除时,它正在工作。 但这是第一次不起作用。第一次获取NULL但第二次工作正常。保存时我也尝试使用editor.commit()

2 个答案:

答案 0 :(得分:1)

使用getSharedPreferences("MyPref", Context.MODE_PRIVATE)然后commit立即反映更改

SharedPreferences preferences = getSharedPreferences("MyPref", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("menu_bar","abcd");
editor.commit(); 

Official Documentation

  

将您的首选项更改从此编辑器返回到正在编辑的SharedPreferences对象。这自动执行所请求的修改,替换当前在SharedPreferences中的任何内容。

     

请注意,当两个编辑者同时修改偏好时,最后一个编辑申请获胜。

     

与commit()同步地将其首选项写入持久存储,apply()会立即将其更改提交到内存中的SharedPreferences,但会启动异步提交到磁盘,并且不会通知您任何失败。如果此SharedPreferences上的另一个编辑器在apply()尚未完成时执行常规commit(),则commit()将阻塞,直到完成所有异步提交以及提交本身。

     

由于SharedPreferences实例是进程中的单例,如果您已经忽略了返回值,则可以使用apply()替换commit()的任何实例。

     

您无需担心Android组件生命周期及其与apply()写入磁盘的交互。该框架确保在切换状态之前完成apply()的飞行中磁盘写入。

     

预计不会直接实现SharedPreferences.Editor接口。但是,如果您之前已实现它并且现在收到有关缺少apply()的错误,则只需从apply()调用commit()即可。

答案 1 :(得分:0)

尝试使用相同的SharedPreferences实例。最简单的是一个明确命名的:

class MyActivity {
  private static final String PREFS_NAME = "myActivityPrefs";
  private static SharedPreferences sharedPrefs = null;
  public static SharedPreferences prefs(Context context) {
    if (sharedPrefs == null) {
      sharedPrefs = context.getSharedPreferences(PREFS_NAME, 0);
    }
    return sharedPrefs;
  }
}

然后在这样的活动中使用它:

prefs(this).edit().putString("menu_bar","abcd").apply()

在片段中:

String name = MyActivity.prefs(getActivity()).getString("menu_bar","");

这是一种推荐的操作模式,可以在不等待主线程上的I / O的情况下提供良好的性能 - apply()为您执行此操作,但需要使用相同的实例保持一致。

要使用单独的实例(有时您被迫 - 例如通过单独的进程)总是使用commit(),这有时会冻结您的主线程,仍然不会由于文件系统的工作方式,保证了一致性,我已经看到commit()数据不能立即用于单独进程的情况,通常是在具有FS配置怪癖的特定设备上。