-1

こんにちは、Android 3.2 でこのエラーが発生しましたが、それは私のコードを指していないため、修正方法がわかりません

05-07 18:08:36.960: E/AndroidRuntime(12435): FATAL EXCEPTION: main
05-07 18:08:36.960: E/AndroidRuntime(12435): java.util.ConcurrentModificationException
05-07 18:08:36.960: E/AndroidRuntime(12435):    at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:573)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:44)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at com.google.android.maps.MapView.onDraw(MapView.java:530)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at android.view.View.draw(View.java:9304)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at android.view.ViewGroup.drawChild(ViewGroup.java:2586)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2189)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at android.view.ViewGroup.drawChild(ViewGroup.java:2584)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2189)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at android.view.ViewGroup.drawChild(ViewGroup.java:2584)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2189)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at android.view.ViewGroup.drawChild(ViewGroup.java:2584)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2189)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at android.view.View.draw(View.java:9307)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at android.widget.FrameLayout.draw(FrameLayout.java:419)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2076)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at android.view.ViewRoot.draw(ViewRoot.java:1706)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at android.view.ViewRoot.performTraversals(ViewRoot.java:1420)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at android.view.ViewRoot.handleMessage(ViewRoot.java:2066)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at android.os.Handler.dispatchMessage(Handler.java:99)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at android.os.Looper.loop(Looper.java:132)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at android.app.ActivityThread.main(ActivityThread.java:4126)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at java.lang.reflect.Method.invokeNative(Native Method)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at java.lang.reflect.Method.invoke(Method.java:491)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
05-07 18:08:36.960: E/AndroidRuntime(12435):    at dalvik.system.NativeStart.main(Native Method)

ただし、これはエラーの原因となるコードです

protected ItemizedOverlay<OverlayItem> doInBackground(Void... params) {
...
synchronized (this.mapView) {//ConcurrentModificationException
                    if (!this.isCancelled())
                    {

                        for (Object element : this.mapView.getOverlays()) {
                            Overlay o  = (Overlay) element;
                            if (o instanceof GestionaleItemizedOverlay)
                            {
                                this.mapView.getOverlays().remove(o);//this one
                            }

                        }

                        if (overlay.size() > 0)
                        {
                            this.mapView.getOverlays().add(overlay);//or this one
                        }
                    }
                }
...


}

どうすれば私のコードを修正できますか?

4

1 に答える 1

1

リストを繰り返し処理している間は、リストを変更、追加/削除することはできません。Iterator使用しているforeachループは、バックグラウンドでオブジェクトを作成します。リストを変更する場合は、通常のforループを使用します。

次のことを試してみてください、あなたはアイデアを得るはずです。

List list = this.mapView.getOverlays();
for(int i = 0:i<list.size();i++){
    Overlay o  = (Overlay) list.get(i);
    if (o instanceof GestionaleItemizedOverlay)
    {
        this.mapView.getOverlays().remove(o);//this one
    }
}

MapViewオーバーレイに固有のより正確なソリューションを次に示します。

于 2012-05-07T16:21:50.170 に答える