2015-07-20 87 views
5

当我开发一个android应用程序时,遇到了我没有任何线索的异常;我搜索了相关的主题,但没有一个帮助。Android中访问共享首选项时出现ConcurrentModificationException

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

发布您的代码! – Rami

+0

我知道ConcurrentModificationException,但我不确定是哪里造成这个 –

+0

你如何期待我们在没有看到代码的情况下帮助你?尝试调试您的应用程序以查找此异常的来源。 – Rami

回答

1

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

+1

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

2

首选项是线程安全的(!),但不是处理安全的。上面的答案根本不是真的,不需要同步所有的东西。这里的问题,如statet出另一个问题是,每个文件不得修改由getStringSet和GETALL

getStringSet()

注意返回任何情况下,你不能修改返回的集实例这个电话。 如果存储数据的一致性不能保证,也不能保证您根本无法修改实例。

getAll() 

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

To the other question

Documentation