1

の由来がわかりませんConcurrentModificationException。私activityは電話して updateMapOverlay()います。また、定期的に呼び出されるupdateMapOverlay()別のスレッド (a) 内で呼び出しています。両方のスレッドからTimerTask呼び出すときに、適切なロックを取得しています。この問題は、非 UI スレッド (つまり)内からupdateMapOverlay()呼び出しているために発生していますか? 他の誰かが同様の問題に直面していますか?updateMapOverlayTimerTask

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 のバッキング List/Map のみを変更する限り、安全です。

マークが指摘したように、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 に答える