Плохая производительность карты Android из-за множества наложений?

У меня есть карта в моем приложении для Android, которая показывает много маркеров (~ 20-50). Но приложение работает очень плохо, когда я пытаюсь прокручивать / масштабировать (в Google Android Maps я выполнил пример поиска пиццы, и также было найдено около 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();
}

person Dave    schedule 17.04.2010    source источник


Ответы (3)


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

person CaseyB    schedule 17.04.2010
comment
Не только это, вы можете иметь более одного маркера в наложении. Ваш псевдокод написан таким образом, что вы добавляете один и тот же оверлей один раз для каждого маркера -- mapOverlays.add(itemizedOverlay); -- что точно вам не поможет. - person CommonsWare; 18.04.2010
comment
Мне тоже было бы интересно. - person Tobias Reich; 05.12.2012

Я сделал следующее сейчас, и он работает быстро (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

}

и в MyOverlay:

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

public void populateNow(){
    populate();
}

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

person Dave    schedule 18.04.2010
comment
Так намного лучше. Большое спасибо! :-) - person Tobias Reich; 05.12.2012

Я столкнулся с той же проблемой прошлой ночью, и мое решение было таким же, как и ваше. Я чувствовал себя странно из-за того, как я назвал метод заполнения.

У меня был тот же код, что и у вас, но я позвонил

speedyPopulate() { 
  populate(); 
}

в классе MyOverlay

person Jason Hocker    schedule 17.09.2010