SharedPreferences值未更新

时间:2012-04-17 06:28:21

标签: android xml 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();
}

5 个答案:

答案 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首次运行时调用,但每次用户唤醒时都会调用。