2012-07-08 81 views
0

I'm使用代码绘制路线在MapActivity:java.util.ConcurrentModificationException绘制路线

ArrayList<Routemark> route_marks = navSet.getRoutemarks(); 

    for(int i = 2; i < route_marks.size() - 1; i++) 
    { 
     try 
     { 

      DirectionPathOverlay dpo = new DirectionPathOverlay(point1, point2);  
      mMapView01.getOverlays().add(dpo); 

       point1 = point2; 
      lon_d = Double.parseDouble(route_marks.get(i).getLongitude()) * 1E6; 
      lon = (int)lon_d; 
      lat_d = Double.parseDouble(route_marks.get(i).getLatitude()) * 1E6; 
      lat = (int)lat_d; 
      point2 = new GeoPoint(lat, lon); 
      list_points.add(point2); 

     } 
     catch(Exception e) { 
      } 


    } 
    mMapView01.getOverlays().add(new DirectionPathOverlay(point2, point2)); 

而且

public class DirectionPathOverlay extends Overlay { 

private GeoPoint gp1; 
private GeoPoint gp2; 

public DirectionPathOverlay(GeoPoint gp1, GeoPoint gp2) { 
    this.gp1 = gp1; 
    this.gp2 = gp2; 
} 

@Override 
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, 
     long when) { 
    // TODO Auto-generated method stub 
    Projection projection = mapView.getProjection(); 
    if (shadow == false) { 

     Paint paint = new Paint(); 
     paint.setAntiAlias(true); 
     Point point = new Point(); 
     projection.toPixels(gp1, point); 
     paint.setColor(Color.BLUE); 
     Point point2 = new Point(); 
     projection.toPixels(gp2, point2); 
     paint.setStrokeWidth(2); 
     canvas.drawLine((float) point.x, (float) point.y, (float) point2.x, 
       (float) point2.y, paint); 
    } 
    return super.draw(canvas, mapView, shadow, when); 
} 

@Override 
public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
    // TODO Auto-generated method stub 

    super.draw(canvas, mapView, shadow); 
} 

}

I'm执行代码到新的线程,我得到的豁免:

07-08 18:23:21.179: E/AndroidRuntime(23510): FATAL EXCEPTION: main 
07-08 18:23:21.179: E/AndroidRuntime(23510): java.util.ConcurrentModificationException 
07-08 18:23:21.179: E/AndroidRuntime(23510): at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:569) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:44) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at com.google.android.maps.MapView.onDraw(MapView.java:530) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at android.view.View.draw(View.java:11082) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at android.view.ViewGroup.drawChild(ViewGroup.java:2991) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at android.view.ViewGroup.drawChild(ViewGroup.java:2989) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at android.view.ViewGroup.drawChild(ViewGroup.java:2989) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at android.view.ViewGroup.drawChild(ViewGroup.java:2989) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2593) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at android.view.View.draw(View.java:11085) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at android.widget.FrameLayout.draw(FrameLayout.java:462) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2145) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at android.view.ViewRootImpl.draw(ViewRootImpl.java:2026) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1634) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2442) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at android.os.Looper.loop(Looper.java:137) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at android.app.ActivityThread.main(ActivityThread.java:4441) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at java.lang.reflect.Method.invokeNative(Native Method) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at java.lang.reflect.Method.invoke(Method.java:511) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
07-08 18:23:21.179: E/AndroidRuntime(23510): at dalvik.system.NativeStart.main(Native Method) 

问题在哪里?

回答

2

ConcurrentModificationException通常在您尝试修改List而遍历它时引发。如果你需要实现这种功能,你应该使用CopyOnWriteArrayList而不是简单的ArrayList。希望这可以帮助。

+0

嗨,叶戈尔,我修改了示例代码。 ¿你建议改变'ArrayList的 route_marks = navSet.getRoutemarks()'和使用的CopyOnWriteArrayList? – 2012-07-08 19:10:57

+0

@PlanComunicacion,是的,你说得对 – Egor 2012-07-08 19:13:11

+0

嗨叶戈尔,我更改代码照你说的,但我得到了同样的错误:'07-08 20:45:28.089:E/AndroidRuntime(26032):致命异常:主要 07-08 20:45:28.089:E/AndroidRuntime(26032):java.util.ConcurrentModificationException 07-08 20:45:28.089:E/AndroidRuntime(26032):\t at java.util.ArrayList $ ArrayListIterator。下一个(ArrayList.java:569) 07-08 20:45:28.089:E/AndroidRuntime(26032):\t在com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:44)...'我认为问题出在绘图代码中。任何想法? – 2012-07-08 19:49:01