これを他のスレッドで調べて、そこにある解決策を私自身の問題に適用しようとしましたが、何も動作していないようです。だからここに行く:アンドロイド:マップオーバーレイを使用した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
}
このスレッドを見るhttp://stackoverflow.com/questions/1775717/explain-synchronization-of-collections-when-iterators-are-used – aviad
投稿したコードに何も問題はありません。オーバーレイがArrayListの独自のコピーであることを反復し、別の場所(別のスレッドの別の場所)で別のものを更新していると考えているかもしれませんが、実際は同じオブジェクトです。それは可能ですか? –
それは完全に可能です。そのArrayListから追加/削除する唯一の他の場所は別のクラスの別のスレッドですが、ユーザーが追加/削除ボタンを押したときに発生します。その後、このコードがすべて呼び出されます。それがそれかもしれないと思いますか?私は彼らが次々に呼び出されたと仮定しました... – Leonidas