2015-07-20 72 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