我有一个从网络服务返回的已定义对象列表(网络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)
我不知道这有什么错呢?我没有调用任何函数来修改对象,我只是“克隆”它,据我所知,这不会改变我的对象中的任何一个位。 任何想法表示赞赏,谢谢。
是的,我做到了(正如你可以在我编辑的文章中看到的那样),我已经将源代码放入同步块中。但它仍然会抛出异常。 – toantran 2013-03-11 09:25:21
你还可以发布修改数据的代码...你是否正在同步该部分也... – 2013-03-11 09:30:29
MyService.getInstance()。updateListOfMyObject() - >这个函数是我修改数据的地方(我上传新数据网络连接)。 我有一个对象列表来缓存我的对象,更新新的对象,并检索 – toantran 2013-03-11 09:31:16