2012-05-07 11 views
-1

こんにちは私は、Android 3.2で、このエラーを取得し、それは私のコードを指していないので、私はそれがは、上のこのConcurrentModificationExceptionを修正することはできませんアンドロイド

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 
         } 
        } 
       } 
... 


} 

私のコードを修正するにはどうすればよいですか?

+0

'List'が同期されていないので、' synchronized'を使うべきだと思います。 –

+0

私はsyncronized(this.mapView)を使っていますか?さらにthis.mapView.getOverlays()は返します。戻り値: オーバーレイのリスト。これはCollections.synchronizedList(java.util.List)によって実行されています。したがって、それを照会するか自由に感じるように変更し、変更が次の抽選またはイベントに反映されます。ただし、繰り返し処理する場合は、ループ全体をリスト上のブロックに囲む必要があります。 – max4ever

答えて

1

反復処理中は、リストの変更、追加/削除はできません。使用しているforeachループは、バックグラウンドでIteratorオブジェクトを作成します。リストを変更するには、通常の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 
    } 
} 

Hereは、MapViewオーバーレイに固有のより正確なソリューションです。

+0

私は.removeにコメントし、.addもこのエラーを引き起こすことに気付きました – max4ever

+0

、まだエラーが発生しました – max4ever

+0

バッキングリストにロックを持つ別の 'Iterator'が必要です。より多くのコードを投稿するか、実行を見てください。まず[this](http://stackoverflow.com/questions/6294061/java-util-concurrentmodificationexception)を見てください。 – user845279

関連する問題