2010-04-17 12 views
5

Tengo un mapa en mi aplicación de Android que muestra muchos marcadores (~ 20-50). Pero la aplicación funciona muy mal cuando trato de desplazarme/acercarme (en Google Android Maps hice una búsqueda de muestra de pizza y también encontré unos 20-50 resultados y no noté ningún problema particular de rendimiento al hacer zoom/desplazarse por el mapa).Android Map ¿Desempeño pobre debido a muchas superposiciones?

Aquí está mi (pseudo) Código:

onCreate() { 
    .... 
    drawable = this.getResources().getDrawable(R.drawable.marker1); 
    itemizedOverlay = new MyItemizedOverlay(drawable,mapView); 
    ... 
    callWebServiceToRetrieveData(); 

    createMarkers(); 
} 

createMarkers(){ 
    for(elem:bigList){ 
     GeoPoint geoPoint = new GeoPoint((int)(elem.getLat()*1000000), (int) (elem.getLon()*1000000)); 
     OverlayItem overlayItem = new OverlayItem(geoPoint, elem.getName(), elem.getData()); 
     itemizedOverlay.addOverlay(overlayItem); 

     mapOverlays.add(itemizedOverlay); 
} 
mapView.invalidate(); 

}

la MyItemizedOverlay.addOverlay se parece a esto:

public void addOverlay(OverlayItem overlay) { 
    m_overlays.add(overlay); 
    populate(); 
} 

Respuesta

8

Si entiendo cómo esto funciona correctamente, no debe llame a poblar después de cada agregar una superposición. Deberías hacerlo una vez que los hayas agregado todos. Creo que lo que está sucediendo es que se agrega la primera OverlayItem y llamar populate() por lo que añade que a la ItemizedOverlay. Luego se agrega una segunda OverlayItem a la lista y llamar populate() y añade esos dos superposiciones a la ItemizedOverlay resultando en tres artículos en la superposición. Entonces creo que estás ganando mucho más de lo que piensas.

+0

No sólo eso, sino que puede tener más de un marcador en una superposición. La forma en que se escribe su pseudocódigo, está agregando * la misma superposición * una vez por marcador - 'mapOverlays.add (itemizedOverlay);' - que no le ayudará exactamente. – CommonsWare

+1

¿cómo puedo mejorar esto? – Dave

+0

Sería interesante para mí también. –

6

que he hecho lo siguiente ahora y funciona rápido (er):

createMarkers(){ 
    for(elem:bigList){ 
     GeoPoint geoPoint = new GeoPoint((int)(elem.getLat()*1000000), (int) (elem.getLon()*1000000)); 
     OverlayItem overlayItem = new OverlayItem(geoPoint, elem.getName(), elem.getData()); 
     itemizedOverlay.addOverlay(overlayItem); 

    } 
    itemizedOverlay.populateNow(); 
    mapOverlays.add(itemizedOverlay); //outside of for loop 

}

y en MyOverlay:

public void addOverlay(OverlayItem overlay) { 
    m_overlays.add(overlay); 
} 

public void populateNow(){ 
    populate(); 
} 

es esto mejor/corregir ahora? o cualquier otra mejora posible?

+0

Mucho, mucho mejor de esta manera. ¡Muchas gracias! :-) –

0

Anoche encontré el mismo problema, y ​​mi solución fue la misma que la tuya. Me sentí raro acerca de cómo llamé al método populate.

tenía el mismo código que se llama pero

speedyPopulate() { 
    populate(); 
} 

en la clase MyOverlay

Cuestiones relacionadas