访问共享首选项时 Android 中的 ConcurrentModificationException

Posted

技术标签:

【中文标题】访问共享首选项时 Android 中的 ConcurrentModificationException【英文标题】:ConcurrentModificationException in Android while accessing Shared Preferences 【发布时间】:2015-10-09 08:43:38 【问题描述】:

当我开发一个安卓应用程序时,我遇到了我没有任何线索的异常;我用谷歌搜索了相关主题,但没有一个有帮助。

Fatal Exception: java.util.ConcurrentModificationException
    java.util.HashMap$HashIterator.nextEntry (HashMap.java:806)
    java.util.HashMap$KeyIterator.next (HashMap.java:833)
    com.android.internal.util.XmlUtils.writeSetXml (XmlUtils.java:298)
    com.android.internal.util.XmlUtils.writeValueXml (XmlUtils.java:447)
    com.android.internal.util.XmlUtils.writeMapXml (XmlUtils.java:241)
    com.android.internal.util.XmlUtils.writeMapXml (XmlUtils.java:181)
    android.app.SharedPreferencesImpl.writeToFile (SharedPreferencesImpl.java:596)
    android.app.SharedPreferencesImpl.access$800 (SharedPreferencesImpl.java:52)
    android.app.SharedPreferencesImpl$2.run (SharedPreferencesImpl.java:511)
    java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1112)
    java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:587) 
    java.lang.Thread.run (Thread.java:841)

【问题讨论】:

我知道 ConcurrentModificationException ,但我不确定是什么原因造成的 您希望我们如何在不查看代码的情况下为您提供帮助?尝试调试您的应用程序以查找此异常的根源。 【参考方案1】:

首选项是线程安全的(!),但不是进程安全的。的答案 @mohan mishra 根本不正确,不需要同步所有内容。正如另一个问题所述,这里的问题是,根据文档,您不得修改 getStringSet 和 getAll 返回的任何实例

getStringSet()

请注意,您不得修改此调用返回的集合实例。 如果您这样做,则无法保证存储数据的一致性,也不能保证 您完全可以修改实例。

getAll()

注意,不能修改此方法返回的集合, 或更改其任何内容。您存储的数据的一致性是 不保证会这样做。

To the other question

Documentation

【讨论】:

【参考方案2】:

请确保您没有从任何类型的后台线程访问首选项。此外,您添加到偏好中的所有方法都必须同步(如果您有自己的偏好管理类)

【讨论】:

您可以使用代码检查它 if(looper.mylooper() != looper.getmainlooper())

以上是关于访问共享首选项时 Android 中的 ConcurrentModificationException的主要内容,如果未能解决你的问题,请参考以下文章

iOS 等效于 Android 共享首选项

Android:在JUnit中传递上下文并使用共享首选项

如何访问 SherlockFragment 中的共享首选项

在 2 个 Android 应用程序之间共享数据

如何使用 Android Studio 查看共享首选项文件?

如何使用android中的共享首选项将数据保存在editText中[重复]