0

ItemizedOverylayNexus One の Google マップ (Android 2.1) でダイナミック (以下のコードを参照してください) を作成しようとしています。

私のActivity(MapActivityを拡張する)では、ネットワークからデータを受信するデータスレッドを作成しています。「ハンドラー」は、受信スレッドからマップ アクティビティにデータを伝達するために使用されます。このデータには、地図に重ねたいマーカーの位置 (緯度、経度) が含まれています。各マーカーの位置は動的です (つまり、ネットワークから新しいデータを受信するたびに変化します)。 メソッドはハンドラーのrefreshItems(ArrayList<OverlayItem> newItems)内部で呼び出されます。handleMessage()渡される ArrayList には約 11 個のマーカーがあります。refreshItems

地図上に重ねられたマーカーが見えます。ただし、次の 2 つの問題があります。

  1. 古いマーカーはマップから削除されません。しばらくすると、マーカーの跡が見えます。

  2. マップはタッチ コマンドに反応しません。地図を移動したり、ズームインまたはズームアウトしたりできません。しばらくすると、アプリが応答していないというシステム警告 (待機/終了?) メッセージが表示されます。

ここで何が問題なのですか?

ありがとう。

    public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> {

private ArrayList<OverlayItem> overlayItems;

public CoTItemizedOverlay(Drawable defaultMarker) {
    super(boundCenter(defaultMarker));
    overlayItems = new ArrayList<OverlayItem>();
    populate();
}

public void addNewItem(GeoPoint location, String markerText, String snippet) {
    overlayItems.add(new OverlayItem(location, markerText, snippet));
    populate();
}

public void removeItem(int index) {
    overlayItems.remove(index);
    populate();
}

public void refreshItems(ArrayList<OverlayItem> newItems) {
    // remove all existing items
    for (int i = 0; i < cotoverlayItems.size(); i++) {
        overlayItems.remove(i);
    }

    // copy all the items
    if (newItems != null && cotoverlayItems.size() == 0) {
        overlayItems.addAll(newItems);
    }

    populate();
}

@Override
protected OverlayItem createItem(int index) {
    return overlayItems.get(index);
}

@Override
public int size() {
    return overlayItems.size();
}

}

4

2 に答える 2

0

あなたはいたるところにpopulateを呼んでいます。このスレッドを読んでください: オーバーレイが多いため、Android マップのパフォーマンスが低下していますか?

これが、古いマーカーが消えない理由でもあります。

于 2010-05-07T04:09:04.473 に答える
0

これを試して:

-- 新しいマーカーを取得して表示する前に、すべての古いマーカーをクリアします

YourMapOverlay mapOverLay = mapView.getOverlays();
mapOverlay.clear();
于 2012-03-27T10:17:34.427 に答える