即使使用了synchronized关键字也有ConcurrentModificationException

时间:2013-03-11 09:10:48

标签: android list exception object concurrency

我有一个列表,我的定义对象从网络服务返回(网络svc将更新此列表)。 在某个时间点,我想在我的列表视图中呈现我已经拥有的内容。 我有以下代码:

List<MyObject> myObjects = MyService.getInstance().getListOfMyObject()

因为我有另一个会更新myObjects列表的线程,所以我想避免并发修改异常。 我有:

 List<MyObject> clonedList = null;
 synchronized(myObjects){
         clonedList = MyListUtils.cloneList(myObjects)
 }
MyListUtils中的

cloneList()函数以一种简单的方式实现:

public static <T extends ICloneable<T>> List<T> cloneList(final List<T> source){
    List<T> result  = new ArrayList<T>();
    for(T t : source){
       T newObject = t.clone();
       result.add(newObject);
    }
    return result;
}

- 不关心ICloneable接口,我用这个ICloneable标记东西。

我得到了这个例外

03-11 16:07:11.370: E/AndroidRuntime(8076): FATAL EXCEPTION: main
03-11 16:07:11.370: E/AndroidRuntime(8076): java.util.ConcurrentModificationException
03-11 16:07:11.370: E/AndroidRuntime(8076):  at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:569)
03-11 16:07:11.370: E/AndroidRuntime(8076):  at xxx.utilities.MyListUtils.cloneList(CollectionUtils.java:120)

我不知道它有什么问题?我没有调用任何函数来修改对象,我只是“克隆”它,据我所知这不会改变我对象中的任何一个位。 感谢任何想法,谢谢。

1 个答案:

答案 0 :(得分:1)

根据某些帖子我可以找到java.util.ConcurrentModificationException in Android animationHow to handle ConcurrentModificationException in Android

如果你在列表上进行迭代,同时其他一些线程也在调整它...这也会导致ConcurrentModificationException ..所以你可以试试sychronizing {{1}对列表的传递对象的方法..

cloneList

我希望您已经在修改数据的线程中执行此操作...