2013-03-11 53 views
1

我有一个从网络服务返回的已定义对象列表(网络svc将更新此列表)。 在某个时间点上,我想在我的列表视图中呈现我已经拥有的内容。 我有以下代码:即使使用同步关键字也会产生ConcurrentModificationException

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

而且因为我有另一个线程将更新myObjects名单,所以我想避免并发修改例外。 我有:在MyListUtils

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

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接口-Dont照顾,我用这个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

按某个线程我能找到像java.util.ConcurrentModificationException in Android animationHow to handle ConcurrentModificationException in Android

如果你是遍历列表,并在同一时间其他线程也modyfing吧..这也将导致ConcurrentModificationException ..所以,你可能会sychronizingcloneList方法列表传递的对象上尝试..

synchronized(source) 
{ 
    // make a copy 
} 

我希望你已经在被修改数据的线程做这个...

+0

是的,我做到了(正如你可以在我编辑的文章中看到的那样),我已经将源代码放入同步块中。但它仍然会抛出异常。 – toantran 2013-03-11 09:25:21

+0

你还可以发布修改数据的代码...你是否正在同步该部分也... – 2013-03-11 09:30:29

+0

MyService.getInstance()。updateListOfMyObject() - >这个函数是我修改数据的地方(我上传新数据网络连接)。 我有一个对象列表来缓存我的对象,更新新的对象,并检索 – toantran 2013-03-11 09:31:16

相关问题