我创建了一个服务,一旦用户将其放置在主屏幕上就会写入一些有关小部件的信息(信息是从重置活动中获取的)。我还记下了用户设置的小部件数量。
用户删除小部件后,我会在共享首选项中删除该信息。
我所经历的是,如果用户放置例如2个小部件,然后删除一个,然后再次放置一个,快速执行所有这些操作,共享首选项文件中的值不一致。有时它工作正常,但大多数时候我会遇到错误的值。
我正在使用apply(),我尝试过提交,但同样的事情发生了。
我存储在共享首选项中的值对于系统工作至关重要,如果没有它,则小部件无用,因为它们是基于用偏好写入的用户配置来自互联网的信息备份。
是否更可靠地切换到数据库解决方案或任何其他可行解决方案来解决这种“竞争条件”? (也许强迫我自己的同步机制,但据我从文档中理解,apply()已经同步,读/写应首先进入RAM,这应该使它快速,我不应该遇到任何问题,如这是因为用户无法在物理上设法删除小部件并快速放置一个新小部件,然后2-3秒!)
答案 0 :(得分:0)
尝试使用 synchronized 关键字处理 SharedPreferences 本身。例如,以下是在Android应用程序的SharedPreferences中设置应用程序字符串时可以使用的方法:
public synchronized static void setAppString(Context context, String pref,
String val) {
SharedPreferences sp = context.getSharedPreferences(
APP_PREFS_UNIQUE_ID, Context.MODE_PRIVATE);
Editor editor = sp.edit();
editor.putString(pref, val);
editor.commit();
}
对于少数/简单的键值对,您可能不需要数据库范例的开销。