SharedPreferences值不会更新

我正在尝试更新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(); } 

Solutions Collecting From Web of "SharedPreferences值不会更新"

而不是使用edit.commit(); ,你应该使用edit.apply();应用程序将立即更新首选项对象,并将asynchronous保存新值,以便读取最新值。


承诺()

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

请注意,当两个编辑器同时修改首选项时,最后一个调用commit的成功。

如果你不关心返回值,而是从你的应用程序的主线程中使用它,那么可以考虑使用apply()。

应用()

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

请注意,当两个编辑器同时修改首选项时,最后一个调用申请获胜。

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

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

您不必担心Android组件生命周期及其与apply()写入磁盘的交互。 该框架确保在切换状态之前,从apply()写入的正在进行的磁盘写入完成。

希望它会帮助你..

 SharedPreferences mypref = PreferenceManager.getDefaultSharedPreferences(this); SharedPreferences.Editor prefsEditr = mypref.edit(); prefsEditr.putString("Userid", UserId); prefsEditr.commit(); String task1 = mypref.getString("Userid", ""); 

像这样尝试,

 public SharedPreferences prefs; SharedPreferences.Editor editor = prefs.edit(); editor.putString(Settings.PREF_USERNAME+"", txtuser); editor.putString(Settings.PREF_PASSWORD+"", entered_name); editor.commit(); 

试试这个代码:

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

那么即使我的回答是在问题出现三年之后,我希望这会有所帮助。 这个问题似乎不是来自提交或应用,而是来自代码结构。

让我们来解释一下:在智能手机上,你运行一个APP,但是你不会像在电脑上那样退出APP。 这意味着当你回到智能手机的菜单,APP仍在“运行”。 当你再次点击APP图标时,你不会重新运行APP,而只是将其唤醒。 在juned代码中,我们可以看到他在Create函数中调用getDefaultSharedPreferences。

所以当他第一次运行APP时,他调用getDefaultSharedPreferences。 但是,当他在后台设置APP,然后唤醒APP,呼叫没有完成。

我有同样的问题:我检查是否有我的APP的SharedPreference。 如果没有,我会提示一个表格向用户询问价值。 如果是,我检查偏好的date。 如果太老,我会提示表格。 在表格之后,我保存当前date的首选项。 我注意到的是,关于SharedPreference的存在的testing(设置在与juned相同的位置)仅在APP的第一次运行时完成,而不是在我唤醒APP时完成。 这意味着我无法检查我的SharedPreferences的时间限制!

如何解决? 只需添加:

  @Override public void onResume(){ super.onResume(); // And put the SharedPreferences test here } 

这个代码将在APP的第一次运行时被调用,而且每次用户都唤醒它。