2015-07-20 21 views
5

Kiedy opracowuję aplikację dla systemu Android, natrafiam na wyjątek, którego nie mam pojęcia; Mam wyszukiwane hasła związane z tematem, ale żadna z nich nie pomogła.ConcurrentModificationException w systemie Android podczas uzyskiwania dostępu do wspólnych preferencji

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

zamieścić swoje kod! – Rami

+0

Znam wyjątek ConcurrentModificationException, ale nie jestem pewien, skąd się to bierze. –

+0

A jak oczekujesz od nas pomocy, nie widząc kodu? Spróbuj debugować aplikację, aby znaleźć pochodzenie tego wyjątku. – Rami

Odpowiedz

1

Upewnij się, że nie uzyskujesz dostępu do preferencji z dowolnego typu wątku tła. Również wszystkie metody, które należy dodać do preferencji, muszą być zsynchronizowane (jeśli masz własną preferencję klasy zarządzającej)

+1

Możesz to sprawdzić za pomocą kodu, jeśli (looper.mylooper()! = Looper.getmainlooper()) –

2

Preferencje są bezpieczne dla wątków (!), Ale nie są bezpieczne w procesie. Powyższa odpowiedź jest po prostu nieprawdziwa, nie ma potrzeby synchronizowania wszystkiego. Problemem tutaj, jak statet w innym pytaniem jest to, że za dokumentacji nie wolno ci modyfikować żadnej instancji, który jest zwracany przez getStringSet i GETALL

getStringSet()

pamiętać, że nie należy zmodyfikować zestaw wystąpienie zwrócony przez to wezwanie. Konsystencja przechowywanych danych nie jest gwarantowana, jeśli tak się stanie, ani nie ma możliwości modyfikacji instancji w ogóle.

getAll() 

Należy pamiętać, że nie wolno modyfikować kolekcji zwrócony przez tą metodą, ani zmieniać jego zawartości. Konsystencja przechowywanych danych to , co nie jest gwarantowane.

To the other question

Documentation

Powiązane problemy