2

Android 애플리케이션에 문제가 있습니다.Android ConcurrentModification onDraw()

목록이나 도형을 반복적으로 반복하는 스레드가 있으며 위치를 업데이트하고 때로는 목록에서 항목을 제거합니다. 스레드의 while 루프가 끝날 때 postInvalidate()를 호출하여 다시 칠해 줄 것을 요청합니다.

다음은 ArrayList를 수정 한 코드입니다.

onDraw 메서드는 각 루프마다 a를 사용하여 각 항목을 그립니다. 필자는 반복자를 통해 목록을 수정하는 것만으로도 onDraw 메서드에서 동시 수정을 얻고 있습니다. CopyOnWriteArrayList 및 Collections.synchronized 동일한 결과를 시도했다.

어떤 도움

주시면 감사하겠습니다.

답변

1

해결 방법에는 몇 가지가 있습니다. 하나는 스레드와 onDraw에서 동기화 된 블록을 사용하는 것이지만 두 번째 스레드가 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(); 
    } 
} 

이 같아야합니다. 딥 카피를 작성하고있는 경우, thread가 같은리스트를 변경하고 있지 않기 때문에, 동기의 문제는 발생하지 않습니다. 동기화 된 블록은 드로잉 중에 스레드가 드로잉 기능의 복사본을 덮어 쓰지 못하도록합니다. 유일하게 남은 문제는 드로잉이 끝날 때까지 스레드의 목록 덮어 쓰기가 멈추지 만 그보다 자주 업데이트하는 것이 화면에 표시되지 않으므로 받아 들일 만합니다.

관련 문제