Android 2.1 GoogleMaps ItemizedOverlay ConcurrentModificationException

时间:2010-05-20 03:00:32

标签: android google-maps concurrency android-mapview itemizedoverlay

我无法弄清楚ConcurrentModificationException的来源。在我的activity我正在打电话 updateMapOverlay()。我也在另一个定期调用的Thread(updateMapOverlay())中调用TimerTask。从两个线程调用updateMapOverlay()时,我正在使用适当的锁。是否导致此问题是因为我从非UI线程(即updateMapOverlay)内部调用TimerTask。还有其他人遇到过类似的问题吗?

private void updateMapOverlay() {

    this.itemizedOverlay.refreshItems(createOverlayItemsList());
    List<Overlay> overlays = mapView.getOverlays();
    overlays.clear();
    overlays.add(cotItemizedOverlay);
            this.mapview.invalidate();

}

this.itemizedOverlay.refreshItems(createOverlayItemsList()); List<Overlay> overlays = mapView.getOverlays(); overlays.clear(); overlays.add(cotItemizedOverlay); this.mapview.invalidate(); }

感谢。

例外

4 个答案:

答案 0 :(得分:5)

  

这个问题是由于造成的   我正在调用updateMapOverlay   在非UI线程中

  

我也在调用updateMapOverlay()   在另一个线程内(TimerTask)   这是定期调用的。

为什么要不断删除和添加叠加层?只需更新叠加层并使其无效。请参阅here for an example异步更新叠加层。

答案 1 :(得分:1)

感谢您的回复。

但是,在您的代码中,您不是在做类似的事情(map.getOverlays().remove(sites);map.getOverlays().add(sites);)吗?

class OverlayTask extends AsyncTask { @Override public void onPreExecute() { if (sites!=null) { map.getOverlays().remove(sites); map.invalidate(); sites=null; } }

 @Override
 public Void doInBackground(Void... unused) {
  SystemClock.sleep(5000); // simulated work

 sites=new SitesOverlay();

 return(null);

}

 @Override
 public Void doInBackground(Void... unused) {
  SystemClock.sleep(5000); // simulated work

 sites=new SitesOverlay();

 return(null);

答案 2 :(得分:1)

一般来说,只要您只在UI线程上修改ItemizedOverlay的支持列表/地图,您就应该是安全的。

正如马克指出的那样,AsyncTask的:

@Override
protected void onPostExecute(Cursor cursor) {

    // modify List/Map

    populate();
    mapView.invalidate();
}

始终在UI线程上执行,因此这里的修改是安全的。

答案 3 :(得分:0)

我遇到了同样的问题。要回答关于“为什么要不断删除和添加叠加层?”的问题,我这样做是因为我的某些叠加层可能不再存在,或者可能会出现新的叠加层,现有的叠加层可能会改变位置,具体取决于在我的特定应用程序的其余部分发生了什么。此外,我发现没有办法改变OverlayItem的位置而不扩展它,以便我可以这样做。

此外,不会更改逐项覆盖中的项目也会导致并发修改异常吗?