views:

677

answers:

1

Hi,

I'm trying to create a dynamic ItemizedOverylay (please see the code below) on Google Maps (Android 2.1) on a Nexus One.

In my Activity (that extends MapActivity) I'm creating a data thread that is receiving data from the network. A 'handler' is used to communicate the data from the receiving thread to map activity. This data contains the locations (lat, lon) of the markers that I want to overlay on my map. The location of each marker is dynamic (i.e., it changes every time I receive new data from the network.) refreshItems(ArrayList<OverlayItem> newItems) method in invoked inside the handleMessage() of the handler. There are around 11 markers in the ArrayList that is passed to refreshItems

I can see the markers overlayed on the map. However, I've two issues:

  1. The old markers are not removed from the map. After a while I see a trail of markers.

  2. The map doesn't respond to any touch commands. I cannot move the map or zoom in or zoom out. After a while I see a system warning that my app is not responding (wait/close?) message.

Any idea what's wrong here ?

Thanks.

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

}

A: 

You are calling populate all over the place. Read this thread: http://stackoverflow.com/questions/2659770/android-map-performance-poor-because-of-many-overlays/2659886#2659886

This would also be why the old markers don't go away.

CaseyB
Casey, Thanks for your response. Now I'm calling populate only in the refresh method. Another change I did was to clear the list of overlays that I get from the Mapview before adding the new ItemizedOverlay to it. This was killing killing my performance :(.
Soumya Simanta