我有一個從網絡服務返回的已定義對象列表(網絡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