我无法弄清楚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();
}
感谢。
例外:
答案 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的位置而不扩展它,以便我可以这样做。
此外,不会更改逐项覆盖中的项目也会导致并发修改异常吗?