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

时间:2015-07-20 09:23:50

标签: exception concurrency crash

当我开发一个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)

2 个答案:

答案 0 :(得分:4)

首选项是线程安全的(!),但不是进程安全的。的答案 @mohan mishra根本不是真的,不需要同步一切。这里的问题,正如另一个问题中的说法那样,根据文档,你不能修改getStringSet和getAll返回的任何实例

getStringSet()

  

请注意,您不得修改此调用返回的set实例。   如果您这样做,则无法保证存储数据的一致性   你根本无法修改实例。

getAll()
  

请注意,您不得修改此方法返回的集合,   或改变其任何内容。存储数据的一致性是   如果你这样做,我们不能保证。

To the other question

Documentation

答案 1 :(得分:2)

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