写入共享偏好设置太慢了吗?

4
我创建了一个服务,当用户将小部件放在主屏幕上时,该服务会写下一些与小部件相关的信息(这些信息是从confutation activity中提取的)。我还记录了用户设置的小部件数量。用户移除小部件后,我会在共享首选项中删除该信息。
我的经验是,如果用户快速执行以下操作:放置两个小部件,然后删除一个,再放置一个,共享首选项文件中的值就会不一致。有时可以正常工作,但大多数情况下,我会卡在错误的值上。
我使用apply(),我尝试过commit但出现了相同的问题。我存储在共享首选项中的值对于系统的工作非常重要,如果没有这些值,小部件就无用了,因为它们是基于用户配置在互联网上备份的信息,并将其写入首选项中。
是否切换到数据库解决方案更可靠?或者有其他可行的解决方案可以解决这个“竞态条件”吗?(也许强制采用自己的同步机制,但据我从文档中所理解的,apply()已经同步了,读/写应该首先进入RAM,这应该使它快速运行,并且我不应该遇到此类问题,因为用户无法在2-3秒内快速删除小部件并放置一个新的!)

保存到共享首选项应该非常快,比使用数据库快得多。 - tyczj
你在 sharedpreference 文件中放置的关键字是否在小部件之间相同?如果是,它应该是动态的或者在关键字后面加上一个 ID。 - CQM
它是动态的,因此没有重复项,键值对都是唯一的。 - JanBo
1个回答

0

尝试在处理SharedPreferences本身时使用synchronized关键字。例如,这是一个可用于在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();
}

对于一些简单的键值对,您可能不需要数据库范式的开销。


没有帮助,我自己实施了一些同步来修复问题,以防止这种情况发生。 - JanBo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接