Dynamic Overlays slowing down Google Maps (Android 2.1) on Nexus One
- by Soumya Simanta
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:
The old markers are not removed from the map. After a while I see a trail of markers.
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 message.
Any idea what's wrong here ?
Thanks.
public class MyItemizedOverlay extends ItemizedOverlay {
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 times
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();
}
}