25

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

6 回答 6

71

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


犯罪()

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

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

如果您不关心返回值并且您在应用程序的主线程中使用它,请考虑改用 apply()。

申请()

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

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

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

由于 SharedPreferences 实例是进程中的单例,因此如果您已经忽略了返回值,则可以安全地将任何 commit() 实例替换为 apply()。

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

于 2012-04-17T06:55:31.883 回答
2

好吧,即使我的回答是在问题提出 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 首次运行时调用,并且每次用户唤醒它时都会调用。

于 2016-07-27T01:18:01.380 回答
1

希望它会帮助你..

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


String task1 = mypref.getString("Userid", "");
于 2012-04-17T06:37:46.353 回答
0

试试这个代码:

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();
于 2012-04-17T06:40:14.050 回答
0

像这样试试

public SharedPreferences prefs;
SharedPreferences.Editor editor = prefs.edit(); 
editor.putString(Settings.PREF_USERNAME+"", txtuser);
editor.putString(Settings.PREF_PASSWORD+"", entered_name);
editor.apply()
于 2022-01-15T14:46:55.097 回答
-1

像这样试试

public SharedPreferences prefs;
SharedPreferences.Editor editor = prefs.edit(); 
editor.putString(Settings.PREF_USERNAME+"", txtuser);
editor.putString(Settings.PREF_PASSWORD+"", entered_name);
editor.commit();    
于 2012-04-17T06:33:02.360 回答