【问题标题】:Android SharedPreferences ConcurrencyAndroid SharedPreferences 并发
【发布时间】:2012-03-05 23:27:01
【问题描述】:

每当我的应用从提要中检索最新数据时,我都会将日期写入 SharedPreferences。我现在需要读取该值,但是在读取/写入 SharedPreferences 时我找不到太多关于并发的信息。

我是否必须在我的方法中使用 synchronized 关键字来防止/降低导致强制关闭的机会?或者 Google 的人是否以一种我不应该担心的方式创建了 SharedPreferences?

出于记录,我认为由于不频繁的读写操作而发生冲突的可能性不大,尽管我不想假设一切都会“正常工作”。

【问题讨论】:

    标签: android concurrency sharedpreferences


    【解决方案1】:

    在打开 SharedPreferences 时使用标志 MODE_MULTI_PROCESS。这是 Gingerbread (Android 2.3) 中和之前的遗留(但未记录)行为,并且在针对此类版本时隐含此标志。对于面向高于 Android 2.3 的 SDK 版本的应用程序,如果需要,必须明确设置此标志。

    此常量在 API 级别 23 中已弃用。
    MODE_MULTI_PROCESS 在某些 Android 版本中无法可靠运行,而且不提供任何机制来协调跨进程的并发修改。应用程序不应尝试使用它。相反,他们应该使用明确的跨进程数据管理方法,例如ContentProvider

    【讨论】:

    • 此标志仅在跨多个进程使用相同的 SharedPreferences 时有用,但它不会在同一进程中执行任何特定操作。
    【解决方案2】:

    根据android doc

    注意:目前这个类不支持跨多个进程使用。这将在稍后添加。

    所以,如果你担心多线程访问共享首选项,你需要同步。

    【讨论】:

    • 只要在单个进程中使用 SharedPreferences 就不需要同步,不管是否是多线程的。但是,跨多个进程使用时可能会出现问题。当一个进程将首选项写入“磁盘”时,任何其他尝试读取它的进程都会失败并获得一个干净/空的 SharedPreferences,类似于安装后的那个。
    • @3c71 我在同时访问我的 UI 和服务之间的 sharedPreferences 时遇到了这个问题,它们在不同的进程中运行。如何跨进程“同步”调用?
    • @Flyview:我建议“提出新问题”,您可以在新问题中使用这个问题作为参考(并且)接受的问题对您的问题有答案。如果您尝试过这种方法但没有奏效,请将您尝试过的内容放入新问题中。
    • 文件被删除的原因是这样的:commit() 会在执行 SharedPrefs.writeToFile() 时创建一个备份文件。如果主文件写入成功,备份文件将被删除。但是,如果 Process2 运行 SharedPrefs.loadFromDiskLocked() (例如,因为您打开了 prefs 多进程),它将检查是否有备份文件。如果存在,主文件将被删除,备份文件将重命名为主文件。真倒霉,Process2看到备份文件就删除master,但是Process1的writeToFile会在重命名之前删除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2011-12-14
    • 2012-09-06
    • 2011-09-07
    • 2014-05-16
    • 2014-01-31
    • 2011-11-28
    相关资源
    最近更新 更多