2010-04-17 8 views
5

Ho una mappa nella mia applicazione Android che mostra molti marcatori (~ 20-50). Ma l'app si comporta molto male quando provo a scorrere/zoom (in Google Maps di Android ho fatto una ricerca campione di pizza e sono stati trovati anche 20-50 risultati e non ho notato alcun particolare problema di prestazioni durante lo zoom/lo scorrimento la mappa).Le prestazioni della mappa Android sono scadenti a causa di molti overlay?

Ecco il mio (pseudo) Codice:

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

}

il MyItemizedOverlay.addOverlay assomiglia a questo:

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

risposta

8

Se ho ben capito come funziona correttamente, non si dovrebbe chiamare il popolamento dopo ogni aggiunta di una sovrapposizione. Dovresti farlo una volta che li hai aggiunti tutti. Penso che quello che sta succedendo è che si aggiunge il primo OverlayItem e chiamare populate() quindi aggiunge che al ItemizedOverlay. Poi si aggiunge un secondo OverlayItem alla lista e chiamare populate() e aggiunge quelle due sovrapposizioni alla ItemizedOverlay conseguente tre articoli nella sovrapposizione. Quindi penso che stai diventando molto più del 20-50 che pensi.

+0

Non solo, ma si può avere più di un marcatore in un overlay. Il modo in cui è scritto il tuo pseudocodice, stai aggiungendo * lo stesso overlay * una volta per indicatore - 'mapOverlays.add (itemizedOverlay);' - che non ti aiuterà esattamente. – CommonsWare

+1

come posso fare questo meglio? – Dave

+0

Sarebbe interessante anche per me. –

6

ho fatto la seguente ora e funziona veloce (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 

}

e in myoverlay:

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

public void populateNow(){ 
    populate(); 
} 

questo è meglio/corretto ora? o altri miglioramenti possibili?

+0

Molto, molto meglio in questo modo. Grazie mille! :-) –

0

Ho avuto lo stesso problema la scorsa notte e la mia soluzione era uguale alla tua. Mi sentivo strano su come ho chiamato il metodo popolare.

ho avuto lo stesso codice come voi, ma io chiamato

speedyPopulate() { 
    populate(); 
} 

nella classe myoverlay

Problemi correlati