Производительность Карты Android, плохая из-за многих Оверлейных программ?

У меня есть карта в моем приложении андроида, которое показывает много маркеров (~20-50). Но приложение работает очень плохой, когда я пытаюсь прокручивать/масштабировать (в Картах Google Android, я сделал демонстрационный поиск пиццы и было также приблизительно 20-50 найденных результатов, и я не заметил никаких конкретных проблем производительности при изменении масштаба/прокрутке через карту).

Вот мой (псевдо) код:

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

}

MyItemizedOverlay.addOverlay похож на это:

public void addOverlay(OverlayItem overlay) {
    m_overlays.add(overlay);
    populate();
}
5
задан Dave 17 April 2010 в 19:49
поделиться

2 ответа

Я сделал следующее, и это работает быстро (эээ):

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

}

и в MyOverlay:

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

public void populateNow(){
    populate();
}

это лучше / правильно сейчас? или какие-либо другие возможные улучшения?

6
ответ дан 18 December 2019 в 13:12
поделиться

Если я понимаю, как это работает правильно, вам не следует вызывать populate после каждого добавления оверлея. Вы должны сделать это после того, как добавите их все.Я думаю, что происходит то, что вы добавляете первый OverlayItem и вызываете populate () , поэтому он добавляет его к ItemizedOverlay. Затем вы добавляете второй OverlayItem в список и вызываете populate () , и он добавляет эти два оверлея в ItemizedOverlay в результате получается три элемента наложения. Так что я думаю, вы получаете больше, чем 20-50, как вы думаете.

8
ответ дан 18 December 2019 в 13:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: