0

Я пытаюсь создать динамический ItemizedOverylay (см. Код ниже) на Картах Google (Android 2.1) на Nexus One.Динамические оверлеи, замедляющие Google Maps (Android 2.1) на Nexus One

В моем Activity (который расширяет MapActivity) Я создаю поток данных, который принимает данные из сети. «Обработчик» используется для передачи данных из принимающего потока для отображения активности. Эти данные содержат местоположения (lat, lon) маркеров, которые я хочу наложить на мою карту. Расположение каждого маркера является динамическим (т. Е. Изменяется каждый раз, когда я получаю новые данные из сети.) refreshItems(ArrayList<OverlayItem> newItems) метод, вызываемый внутри обработчика handleMessage(). В ArrayList содержится около 11 маркеров, которые передаются в refreshItems

Я вижу маркеры, наложенные на карту. Однако у меня есть два вопроса:

  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(); 
} 

}

+0

Также мне нужно сделать метод обновления поточно? –

ответ

0

Вы вызываете заселить повсюду. Прочтите эту тему: Android Map Performance poor because of many Overlays?

Это также было бы причиной того, что старые маркеры не уходят.

+0

Кейси, спасибо за ваш ответ. Теперь я вызываю заполнение только в методе обновления. Еще одно изменение, которое я сделал, - это очистить список наложений, которые я получаю от Mapview, перед добавлением к нему нового ItemizedOverlay. Это убивало убийство моей работы :(. –

0

Попробуйте это:

- Очистить все старые маркеры, прежде чем получить и отобразить новые маркеры

YourMapOverlay mapOverLay = mapView.getOverlays(); 
mapOverlay.clear(); 
Смежные вопросы