2013-03-11 52 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

相關問題