访问共享首选项时 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的主要内容,如果未能解决你的问题,请参考以下文章