Android SharedPreferences 并发性问题

4
每当我的应用程序从数据源检索到最新的数据时,我会将日期写入SharedPreferences。现在我需要读取该值,但是我找不到关于同时读写SharedPreferences的并发性的太多信息。
我是否需要在方法中使用synchronized关键字来防止/降低造成强制关闭的可能性?或者Google的开发人员已经以一种不必担心这个问题的方式制作了SharedPreferences?
记录一下,尽管读写操作很少,但我不认为存在碰撞的可能性,尽管我不希望假设一切都可以“正常工作”。
2个回答

3
使用标志MODE_MULTI_PROCESS打开SharedPreferences时,这是Gingerbread(Android 2.3)及其之前版本的传统(但未记录在案)行为,并且当针对此类版本进行定位时,该标志被隐含。对于针对Android 2.3以上SDK版本的应用程序,如果需要,则必须显式设置此标志。 此常量已在API级别23中弃用。
MODE_MULTI_PROCESS在某些Android版本上无法可靠工作,并且此外也不提供任何机制来协调跨进程的并发修改。应用程序不应尝试使用它。相反,它们应该使用明确的跨进程数据管理方法,例如ContentProvider

这个标志只有在多个进程中使用相同的 SharedPreferences 时才有用,但是在同一个进程中运行时并没有什么特别作用。 - 3c71

1
根据android doc
注意:当前此类不支持跨多个进程的使用。这将在以后添加。
因此,如果您担心对共享首选项的多线程访问,您需要进行同步。

只要SharedPreferences在单个进程中使用,无论是否多线程,同步都是不必要的。但是,在跨多个进程使用时可能会出现问题。当一个进程将首选项写入“磁盘”时,任何尝试读取它的其他进程都将失败并获得一个干净/空的SharedPreferences,类似于安装后的SharedPreferences。 - 3c71
@3c71,我在同时访问我的UI和Service时遇到了这个问题,它们运行在不同的进程中,共享同一个sharedPreferences。我该如何在进程之间“同步”这些调用呢? - Flyview
@Flyview:我建议您使用“提出新问题”,您可以在新问题中引用此问题作为参考,并且已被采纳的问题有回答您的问题。如果您尝试了这种方法但没有成功,请在新问题中说明您尝试过什么。 - kosa
文件被删除的原因是:在执行SharedPrefs.writeToFile()时,commit()将创建一个备份文件。如果主文件成功写入,则备份文件将被删除。但是,如果Process2运行SharedPrefs.loadFromDiskLocked()(例如因为您打开了prefs多进程),它将检查是否有备份文件。如果存在,则删除主文件并将备份文件重命名为主文件。如果你非常不幸,Process2会看到备份文件并删除主文件,但是Process1的writeToFile会在备份文件被重命名之前删除它。 - David Burström

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