2

我遇到了一個android應用程序的問題。Android ConcurrentModification onDraw()

我有一個不斷迭代器在列表或形狀的線,更新自己的位置,有時從列表中刪除的項目。在線程的while循環結束時,它調用postInvalidate()來提示重繪。

這裏是修改到ArrayList發生的代碼。

​​

onDraw方法使用for each循環來繪製每個項目。儘管只通過迭代器修改列表,但我正在使用onDraw方法進行併發修改。我試過CopyOnWriteArrayList和Collections.synchronized具有相同的結果。

任何幫助,將不勝感激。

回答

1

有一對夫婦的方式來解決這個問題。一種方法是在線程和onDraw中使用synchronized塊,但這會阻止第二個線程與UI線程同時運行。

我認爲最好的辦法是給你用兩個集合。您的代碼應該是這樣的

onDraw(){ 
    synchronized(myList){ 
     //Do your draw code. Get the iterator inside this block 
    } 
} 

threadFunction(){ 
    List threadList; 
    while(1){ 
     //Update threadList, which holds all the objects 
     synchronized(myList){ 
      myList = threadList.copy(); //Do a deep copy, don't just copy over the reference 
     } 
     postInvalidate(); 
    } 
} 

這會讓你的繪製函數在上一個迭代結束上榜的拷貝操作。如果您正在進行深層複製,則不會因爲線程未更改同一列表而導致任何同步問題。同步塊將在繪製期間停止線程覆蓋繪圖函數的副本。唯一剩下的問題是線程中的列表被覆蓋,直到畫出完成,但由於更新頻率比無法顯示在屏幕上更多,我的猜測是可以接受的。