2010-04-17 15 views
5

Benim android uygulamasında birçok işaretleyici (~ 20-50) gösteren bir harita var. Ancak kaydırma/yakınlaştırma yapmaya çalıştığımda uygulama çok kötü performans gösteriyor (Google Android Haritalar'da pizza için örnek bir arama yaptım ve ayrıca yaklaşık 20-50 sonuç bulundu ve yakınlaştırma/kaydırma yaparken herhangi bir performans sorunu fark etmedim. harita).Android Map Çok sayıda Yerleşimler nedeniyle performans düşük?

MyItemizedOverlay.addOverlay şuna benzer

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

}: Burada

benim (sözde) kodudur Bunun doğru nasıl çalıştığını anlamak

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

cevap

8

, yapmamalısın Her yerleşimi ekledikten sonra populate'yi çağırmak. Hepsini ekledikten sonra yapmalısın. Ne oluyor ilk OverlayItem eklemek ve böylece ItemizedOverlay. için Sonra listeye ikinci OverlayItem ekleyip populate() dediğimiz ekler populate() çağrı olduğunu düşünüyorum ve üç öğeleri sonuçlanan ItemizedOverlay için bu iki bindirmeleri ekler bindirme içinde. Yani sanırım düşündüğün 20-50'den daha fazla yol alıyorsun.

+0

Sadece bu içinde

speedyPopulate() { populate(); } 

ettim, ama bir bindirme birden fazla işaretleyici olabilir. Pseudo kodunuzun yazıldığı şekliyle, * her defasında bir kez aynı bindirmeyi * ekliyorsunuz - mapOverlays.add (itemizedOverlay); - ki tam olarak size yardımcı olmayacak. – CommonsWare

+1

Bunu daha iyi nasıl yapabilirim? – Dave

+0

Benim için de ilginç olurdu. –

6

Şimdi aşağıdaki yaptık ve hızlı (er) çalışır:

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 

}

ve MyOverlay içinde

:

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

public void populateNow(){ 
    populate(); 
} 

bu şimdi/daha iyi doğrudur? veya başka iyileştirmeler mümkün mü?

+0

Çok, çok daha iyi bu şekilde. Çok teşekkür ederim! :-) –

0

Dün gece aynı sorunla karşılaştım ve çözümüm sizinkiyle aynıydı. Popülasyon yöntemini nasıl aradığım hakkında garip hissettim.

Seninle aynı kod vardı ama MyOverlay sınıfına

İlgili konular