【问题标题】:SharedPreferences value is not updatedSharedPreferences 值未更新
【发布时间】:2012-04-28 11:55:04
【问题描述】:

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

【问题讨论】:

  • 显示获取值的代码。
  • 您能否展示其他给出正确值的代码。从哪里更新值?如果您在更新共享首选项之前获取值,它肯定会给出旧值。

标签: android xml sharedpreferences


【解决方案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】:

    希望对你有所帮助..

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

    【讨论】:

      【解决方案3】:

      试试这个代码:

      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】:

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


        commit()

        将您的首选项更改从该编辑器提交回 它正在编辑的 SharedPreferences 对象。这原子地执行 请求修改,替换当前在 共享首选项。

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

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

        申请()

        将您的首选项更改从该编辑器提交回 它正在编辑的 SharedPreferences 对象。这原子地执行 请求修改,替换当前在 共享首选项。

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

        与 commit() 不同,commit() 将其偏好写入持久化 同步存储,apply() 将其更改提交到内存中 SharedPreferences 立即但开始异步提交 磁盘,您将不会收到任何故障通知。如果另一个编辑 此 SharedPreferences 执行常规 commit() 而 apply() 是 仍然未完成,commit() 将阻塞,直到所有异步提交都完成 完成以及提交本身。

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

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

        【讨论】:

        • 虽然 apply() 是一个不错的选择,但它确实引入了必须将 min API 设置为 9 (2.3 Gingerbread) 的问题,根据目前的统计数据,这会淘汰大约 30%那里有安卓设备。我发现 commit() 只要您下次检查它就可以工作,您正在创建 SharedPreferences 对象的新实例,这可能不是一个困难的代码更改
        • 如果apply()被异步调用,如果这段代码我为什么要读取最新的值? gist.github.com/anonymous/62637e408baf273a7bc43754422c3739
        • @MaksimDmitriev "apply() 会立即将其更改提交到内存中的 SharedPreferences,但会开始异步提交到磁盘,并且您不会收到任何失败的通知。"当您在输入值并应用它后立即从共享首选项中读取时,它会告诉您来自内存而不是存储的值。
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          这样试试,

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-09-19
            • 2022-01-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多