1

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

private void updateMapOverlay() {

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

}

谢谢。

例外

W/dalvikvm(10641): threadid=3: thread exiting with uncaught exception (group=0x4001b180)
E/AndroidRuntime(10641): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime(10641): java.util.ConcurrentModificationException
E/AndroidRuntime(10641):    at java.util.AbstractList$SimpleListIterator.next(AbstractList.java:64)
E/AndroidRuntime(10641):    at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:41)
E/AndroidRuntime(10641):    at com.google.android.maps.MapView.onDraw(MapView.java:494)
E/AndroidRuntime(10641):    at android.view.View.draw(View.java:6535)
E/AndroidRuntime(10641):    at android.view.ViewGroup.drawChild(ViewGroup.java:1531)
E/AndroidRuntime(10641):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
E/AndroidRuntime(10641):    at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
E/AndroidRuntime(10641):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
E/AndroidRuntime(10641):    at android.view.View.draw(View.java:6538)
E/AndroidRuntime(10641):    at android.widget.FrameLayout.draw(FrameLayout.java:352)
E/AndroidRuntime(10641):    at android.view.ViewGroup.drawChild(ViewGroup.java:1531)
E/AndroidRuntime(10641):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
E/AndroidRuntime(10641):    at android.view.ViewGroup.drawChild(ViewGroup.java:1529)
E/AndroidRuntime(10641):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1258)
E/AndroidRuntime(10641):    at android.view.View.draw(View.java:6538)
E/AndroidRuntime(10641):    at android.widget.FrameLayout.draw(FrameLayout.java:352)
E/AndroidRuntime(10641):    at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1830)
E/AndroidRuntime(10641):    at android.view.ViewRoot.draw(ViewRoot.java:1349)
E/AndroidRuntime(10641):    at android.view.ViewRoot.performTraversals(ViewRoot.java:1114)
E/AndroidRuntime(10641):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
E/AndroidRuntime(10641):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(10641):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(10641):    at android.app.ActivityThread.main(ActivityThread.java:4363)
E/AndroidRuntime(10641):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(10641):    at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(10641):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
E/AndroidRuntime(10641):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
E/AndroidRuntime(10641):    at dalvik.system.NativeStart.main(Native Method)
I/Process (   95): Sending signal. PID: 10641 SIG: 3
4

4 回答 4

5

这个问题是因为我从非 UI 线程内部调用 updateMapOverlay 引起的吗

是的。

我还在定期调用的另一个线程(一个 TimerTask)中调用 updateMapOverlay()。

为什么要不断删除和添加叠加层?只需更新覆盖并使其无效。有关异步更新覆盖的示例,请参见此处。

于 2010-05-20T13:02:56.647 回答
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 onPostExecute(Void unused) {
  map.getOverlays().add(sites);
  map.invalidate();
 }
}
于 2010-05-20T19:16:41.620 回答
1

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

正如 Mark 指出的,AsyncTask 的:

@Override
protected void onPostExecute(Cursor cursor) {

    // modify List/Map

    populate();
    mapView.invalidate();
}

总是在 UI 线程上执行,所以在这里修改是安全的。

于 2010-12-14T11:33:18.503 回答
0

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

此外,更改逐项叠加中的项目是否也会导致并发修改异常?

于 2010-11-12T20:19:56.053 回答