当我开发一个Android应用程序时,我遇到了一个我没有任何线索的异常;我搜索过相关主题,但没有一个帮助过。
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)
答案 0 :(得分:4)
首选项是线程安全的(!),但不是进程安全的。的答案 @mohan mishra根本不是真的,不需要同步一切。这里的问题,正如另一个问题中的说法那样,根据文档,你不能修改getStringSet和getAll返回的任何实例
getStringSet()
请注意,您不得修改此调用返回的set实例。 如果您这样做,则无法保证存储数据的一致性 你根本无法修改实例。
getAll()
请注意,您不得修改此方法返回的集合, 或改变其任何内容。存储数据的一致性是 如果你这样做,我们不能保证。
答案 1 :(得分:2)
请确保您没有从任何类型的后台线程访问首选项。此外,您要添加到首选项的所有方法必须同步(如果您有自己的首选项管理类)