【问题标题】:Why shared preference commit fails?为什么共享首选项提交失败?
【发布时间】:2014-10-24 08:13:01
【问题描述】:

在我的 android 服务中,我注册了动作用户,它将字符串值写入默认共享首选项。同时,我在服务中有另一个功能,它将一个 Hashset 写入共享首选项。我在这两种情况下都使用了提交。

关于用户当前的操作:

PreferenceManager.getDefaultSharedPreferences(getBaseContext()).edit().putString("abc", udata).commit();

在另一个功能上:

if(PreferenceManager.getDefaultSharedPreferences(getBaseContext()).edit().putStringSet("si",ssetdata).commit())

有时第二次写入失败,为什么?是不是因为

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

【问题讨论】:

标签: android sharedpreferences


【解决方案1】:

将 apply 用于第一个并提交到第二个可能会有所帮助,如下所示:

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

Read more here

【讨论】:

    【解决方案2】:

    您的服务是否在单独的进程中运行? (参见AndroidManifest.xml 中的android:process 属性)

    如果是这样,您必须使用MODE_MULTI_PROCESS 打开SharedPreferences。

    【讨论】:

    • 没有。我正在使用相同的过程。
    【解决方案3】:

    尝试拨打您的SharedPreference一次,然后使用editor 提交您的数据:

                    SharedPreference SP;
                    SP = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
                    editor = SP.edit();
    
                    //...
                        editor.putString("abc", udata);
                        editor.commit();
                    //...
                        editor.putStringSet("si",ssetdata)
                        editor.commit()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 2017-12-28
      • 2012-09-08
      • 1970-01-01
      • 2019-03-08
      相关资源
      最近更新 更多