2012-01-23 1 views
1

これを他のスレッドで調べて、そこにある解決策を私自身の問題に適用しようとしましたが、何も動作していないようです。だからここに行く:アンドロイド:マップオーバーレイを使用したConcurrentModificationException

新しいポリゴンオーバーレイを作成するクラス私は、一つは:

public void addPolyLines(ArrayList<KrollDict> polyLines){ 
    // Remove the line overlay 
    List<Overlay> mMapOverlays = view.getOverlays(); 
    boolean rm = mMapOverlays.remove(polyLineOverlay);  

    polyLineOverlay = new PolygonOverlay(polyLines); // KEY LINE 

    mMapOverlays.add(polyLineOverlay); 
    view.invalidate(); 
} 

そして、これらは私のPolygonOverlayクラスの根性があります。 while(it.hasNext())行で同時変更例外がスローされ、その理由がわかりません。私はmPolyLines配列を変更しているとは思わない。 drawLinesはオーバーレイのネイティブ描画メソッドから呼び出され、時には常に呼び出されるように見えます。

ArrayList<KrollDict> mPolyLines; 

public PolygonOverlay(ArrayList<KrollDict> polyLines){ 
     mPolyLines = polyLines; 
} 

public void drawLines(MapView mv, Canvas canvas) { 
     Iterator<KrollDict> it = mPolyLines.iterator(); 

     // Go through each line 
     while(it.hasNext()){// CONCURRENTMODIFICATIONEXCEPTION THROWN HERE 
      KrollDict kd = it.next(); 
      String[] pointsArr = kd.getStringArray("points"); 
      String color = kd.getString("color"); 
      float width = new Float(kd.getDouble("width")).floatValue(); 
      int alpha = kd.getInt("alpha"); 

      int x1 = -1, y1 = -1, x2 = -1, y2 = -1; 
      Paint paint = new Paint(); 
      paint.setColor(Color.parseColor(color)); 
      paint.setStyle(Paint.Style.STROKE); 
      paint.setStrokeWidth(width); 
      //paint.setAlpha(alpha); 

      // Loop through the coordinates 
      for(int i = 0; i< pointsArr.length; i++){ 
       String[] coordinates = convertStringToArray(pointsArr[i]); 
       Double latitude = new Double(Double.parseDouble(coordinates[3]) * 1E6); 
       Double longitude = new Double(Double.parseDouble(coordinates[1]) * 1E6); 
       GeoPoint gp = new GeoPoint(latitude.intValue(), longitude.intValue());          

       Point point = new Point(); 
       point = mv.getProjection().toPixels(gp, point);     

       x2 = point.x; 
       y2 = point.y; 
       if (i > 0) {       
        canvas.drawLine(x1, y1, x2, y2, paint); 
       } 
       x1 = x2; 
       y1 = y2; 
      } 
     }// while 
    } 
+0

このスレッドを見るhttp://stackoverflow.com/questions/1775717/explain-synchronization-of-collections-when-iterators-are-used – aviad

+0

投稿したコードに何も問題はありません。オーバーレイがArrayList の独自のコピーであることを反復し、別の場所(別のスレッドの別の場所)で別のものを更新していると考えているかもしれませんが、実際は同じオブジェクトです。それは可能ですか? –

+0

それは完全に可能です。そのArrayListから追加/削除する唯一の他の場所は別のクラスの別のスレッドですが、ユーザーが追加/削除ボタンを押したときに発生します。その後、このコードがすべて呼び出されます。それがそれかもしれないと思いますか?私は彼らが次々に呼び出されたと仮定しました... – Leonidas

答えて

1

クローンを作ることで

public PolygonOverlay(ArrayList<KrollDict> polyLines){ 
    mPolyLines = (ArrayList<KrollDict>)polyLines.clone(); 
} 

を試してみてください、あなたはそれを反復している間、リストを変更する誰かに対して安全でなければなりません。

+1

コピーコンストラクタを使用してください: 'mPolyLines = new ArrayList (polyLines)'、キャストを保存します。 – Matt

+0

素晴らしい、私は今それを試してみよう! – Leonidas

+0

ねえ、これは今のところうまくいくようです。ありがとう! – Leonidas

関連する問題