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

访问共享首选项时Android中的ConcurrentModificationException,exception,concurrency,crash,Exception,Concurrency,Crash,当我开发安卓应用程序时,我遇到了一个例外,我没有任何线索;我在谷歌上搜索过相关的话题,但没有一个有用 Fatal Exception: java.util.ConcurrentModificationException java.util.HashMap$HashIterator.nextEntry (HashMap.java:806) java.util.HashMap$KeyIterator.next (HashMap.java:833) com.android.in

当我开发安卓应用程序时,我遇到了一个例外,我没有任何线索;我在谷歌上搜索过相关的话题,但没有一个有用

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)

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

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

getStringSet()

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

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


我知道ConcurrentModificationException,但我不确定是什么原因造成的,您希望我们如何帮助您而不查看代码?尝试调试应用程序以查找此异常的来源。如果(looper.mylooper()!=looper.getmainlooper()),则可以使用以下代码检查此异常
getAll()