我将数据存储在共享首选项中
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()
。
答案 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();
将您的首选项更改从此编辑器返回到正在编辑的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配置怪癖的特定设备上。