2012-05-07 2 views
-1

안녕하세요 안드로이드 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

반복되는 동안 List를 수정, 추가/제거 할 수 없습니다. 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

백업 목록에 잠금을 가진 다른 '반복자'가 있어야합니다. 더 많은 코드를 게시하거나 실행을 살펴보십시오. 먼저 [this] (http://stackoverflow.com/questions/6294061/java-util-concurrentmodificationexception)를보십시오. – user845279

관련 문제