0

これはここでの私の最初の質問なので、何か問題があれば教えてください。

これで、ユーザーの場所とHelloItemizedOverlaypublic class MainMap extends MapActivityを使用するがあります。マーカー (かなり基本的なオーバーレイ) を追加したい XML ファイルから特定の POI を取得しています。MyLocationListener

ユーザーがボタンを押すと、AsyncTask が開始されます。

private class GetPOITask extends AsyncTask<String, Void, Void> {

 protected Void doInBackground(String... params) {
    clearMapOverlay();
    if(!isBusyAddingOverlays)
    {
       connect(params[0]);
    }
    return null;
 }

 protected void onPreExecute() {
  clearMapOverlay();
 }
}

MapOverlay を消去します (this.mv は MapView です):

public void clearMapOverlay()
 {
  this.mv.getOverlays().remove(placesItemizedOverlay);
  this.mv.postInvalidate();
  this.mv.getOverlays().add(myLoc);
 }

これは、マーカーを追加するのに十分な情報がある場合に接続メソッドが呼び出すメソッドです。

private void addOverlayToList(int id, GeoPoint point, String title, String description)
{
 //Log.e("Debug", "Adding overlay");
 placesItemizedOverlay.addOverlay(new POIOverlay(id, point, title, description));
 this.mv.getOverlays().add(placesItemizedOverlay);
}

それはすべての関連するコードでなければなりません。

問題は、POI を追加してマップズーム (または移動) すると、ConcurrentModificationException.

このサイトを検索して、同様のスレッド (たとえば、これ)を読んでいますが、自分が間違っていることを実際に見つけることができません。

自分のことを知っていれば、それはおそらく明らかなことです。

前もって感謝します、

イアルウェイン

4

1 に答える 1

0

これは、 が別のスレッド ( ) で呼び出されたaddOverlayToList()から呼び出されたという事実に起因する可能性があります。UI を開始したスレッドのみがそのビューにアクセスできます。connect()doInBackground()

add overlay 呼び出しをonPostExecute()(オーバーライドする必要がある) の に移動しますGetPOITask

于 2011-02-12T23:05:31.130 に答える