1

我有一个从网络服务返回的我定义的对象列表(network 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)

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

4

1 回答 1

1

根据某些线程,我能够在 Android 动画中找到类似 java.util.ConcurrentModificationException以及如何在 Android 中处理 ConcurrentModificationException

如果您正在迭代列表并且同时其他一些线程也在修改它..这也会导致ConcurrentModificationException..所以您可以尝试使用列表的传递对象上的方法sychronizing..cloneList

synchronized(source)
{
    // make a copy
}

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

于 2013-03-11T09:18:59.293 回答