0

여기가 내 첫 번째 질문이므로 잘못된 것이 있으면 알려주십시오.MapActivity의 ConcurrentModificationException

이제 사용자의 위치는 MyLocationListener이고 HelloItemizedOverlaypublic class MainMap extends MapActivity입니다. 마커를 추가하려는 XML 파일에서 특정 POI를 가져옵니다 (꽤 기본적인 오버레이).

사용자가 버튼을 누르면, AsyncTask를 시작 :

private class GetPOITask extends AsyncTask<String, Void, Void> { 

protected Void doInBackground(String... params) { 
    clearMapOverlay(); 
    if(!isBusyAddingOverlays) 
    { 
     connect(params[0]); 
    } 
    return null; 
} 

protected void onPreExecute() { 
    clearMapOverlay(); 
} 
} 

MapOverlay을 (this.mv이지도보기이다) 밖으로 지우기 :

public void clearMapOverlay() 
{ 
    this.mv.getOverlays().remove(placesItemizedOverlay); 
    this.mv.postInvalidate(); 
    this.mv.getOverlays().add(myLoc); 
} 

이것은 내 연결 메소드 호출 방법 마커를 추가하는 데 필요한 충분한 정보가 있습니다.

private void addOverlayToList(int id, GeoPoint point, String title, String description) 
{ 
//Log.e("Debug", "Adding overlay"); 
placesItemizedOverlay.addOverlay(new POIOverlay(id, point, title, description)); 
this.mv.getOverlays().add(placesItemizedOverlay); 
} 

모든 관련 코드가 있어야합니다.

POI의 지도를 확대하거나지도를 확대하면 문제가 발생하므로 ConcurrentModificationException이 표시됩니다.

비슷한 스레드 (예 : this one)를 읽고이 사이트를 검색했지만 실제로 잘못하고있는 것을 찾을 수 없습니다.

나 자신을 알면 분명히 분명합니다. 이 addOverlayToList()가 다른 스레드 (doInBackground())에서라고 connect()에서 호출된다는 사실에서 올 수

답변

0

iarwain 사전에

감사합니다. UI를 시작한 스레드 만이 뷰를 만질 수 있습니다.

의 오버레이 호출을 onPostExecute() (오버라이드해야 함)로 이동하십시오.