我正在尝试更新 SharedPreferences 的值,这是我的代码:
edit = PreferenceManager.getDefaultSharedPreferences(this).edit();
edit.putString(Settings.PREF_USERNAME+"",txtuser);
edit.putString(Settings.PREF_PASSWORD+"",txtpass);
edit.commit();"
问题是当我访问这个值时,它没有返回更新的值,它给了我一个SharedPreferences的值。
但是当我确认 XML 文件中的数据时,数据会更新。
重启我的应用程序后,我得到了更新的值。因此,它需要重新启动应用程序以获取更新的值 那么,一旦它发生变化,如何获得这些更新的值?
提前致谢
以下是我的全部代码:
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
ctx=this;
status=PreferenceManager.getDefaultSharedPreferences(this).getString(Settings.PREF_STATUS, Settings.DEFAULT_STATUS);// get old value
submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
on(ctx,true);// function will call and value is updated
}
}});
status=PreferenceManager.getDefaultSharedPreferences(this).getString(Settings.PREF_STATUS, Settings.DEFAULT_STATUS);// this should give me a updated value but gives old value
}
public static boolean on(Context context) {
return PreferenceManager.getDefaultSharedPreferences(context).getBoolean(Settings.PREF_ON, Settings.DEFAULT_ON);
}
public static void on(Context context,boolean on) {
if (on) Receiver.engine(context).isRegistered(); //
}
**********in reciver file***********
public void isRegistered ) {
Editor edit = PreferenceManager.getDefaultSharedPreferences(Receiver.mContext).edit();
edit.putString(Settings.PREF_STATUS+"","0");
edit.commit();
}
答案 0 :(得分:67)
您应该使用edit.commit();
而不是edit.apply();
。 应用会立即更新偏好设置对象并将新值异步保存,以便您可以阅读最新值。
的提交()强> 的
将您的偏好设置更改从此编辑器返回到 它正在编辑的SharedPreferences对象。这原子地执行 要求修改,替换当前的任何内容 SharedPreferences。
请注意,当两位编辑同时修改首选项时, 最后一个调用commit wins。
如果你不关心返回值而你正在使用它 你的应用程序的主线程,请考虑使用apply()。
应用()强>
将您的偏好设置更改从此编辑器返回到 它正在编辑的SharedPreferences对象。这原子地执行 要求修改,替换当前的任何内容 SharedPreferences。
请注意,当两位编辑同时修改首选项时, 最后一个叫申请获胜。
与commit()不同,后者将其首选项写入持久性 同步存储,apply()将其更改提交到内存中 SharedPreferences立即启动异步提交 磁盘,您不会收到任何故障通知。如果是其他编辑 这个SharedPreferences在apply()时执行常规commit() 仍然未完成,commit()将阻塞,直到所有异步提交为止 完成以及提交本身。
由于SharedPreferences实例是一个进程中的单例,它就是 如果你是的话,可以使用apply()替换任何commit()实例 已经忽略了返回值。
您无需担心Android组件的生命周期及其问题 与apply()写入磁盘的交互。框架确保 在切换状态之前,apply()中的飞行中磁盘写入完成。
答案 1 :(得分:1)
试试这个,
public SharedPreferences prefs;
SharedPreferences.Editor editor = prefs.edit();
editor.putString(Settings.PREF_USERNAME+"", txtuser);
editor.putString(Settings.PREF_PASSWORD+"", entered_name);
editor.commit();
答案 2 :(得分:1)
希望它会帮助你..
SharedPreferences mypref = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor prefsEditr = mypref.edit();
prefsEditr.putString("Userid", UserId);
prefsEditr.commit();
String task1 = mypref.getString("Userid", "");
答案 3 :(得分:1)
试试这段代码:
SharedPreferences edit = PreferenceManager.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor1 = edit.edit();
editor.putString(Settings.PREF_USERNAME + "", txtuser);
editor.putString(Settings.PREF_PASSWORD + "", entered_name);
editor.commit();
答案 4 :(得分:1)
好吧,即使我的回答是在问题发生3年之后,我希望它会有所帮助。问题似乎不是来自提交或应用,而是来自代码结构。
让我们解释一下:在智能手机上,您运行的是APP,但不像我们在计算机上那样退出APP。 这意味着当你回到智能手机的菜单时,APP仍在“运行”。当您再次“点击”APP图标时,您不会重新运行APP而只是唤醒它。 在juned代码中,我们可以看到他在Create函数中调用了getDefaultSharedPreferences。
所以当他第一次运行APP时,他会调用getDefaultSharedPreferences。但是当他在后台设置APP然后唤醒APP时,呼叫没有完成。
我遇到了同样的问题: 我检查我的APP是否有SharedPreference。如果没有,我提示表单向用户询问价值。 如果是,我会检查首选项的日期。如果太旧,我提示表格。 在表单之后,我使用当前日期保存首选项。 我注意到的是,关于SharedPreference(设置在与juned相同的位置)的存在的测试仅在APP的第一次运行时完成,而不是在我唤醒APP时。这意味着我无法检查我的SharedPreferences的时间限制!
如何解决? 只需添加:
@Override
public void onResume(){
super.onResume();
// And put the SharedPreferences test here
}
此代码将在APP首次运行时调用,但每次用户唤醒时都会调用。