Производительность Android-карты плохая из-за большого количества оверлеев? - PullRequest
5 голосов
/ 17 апреля 2010

В моем приложении для 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();
}

Ответы [ 3 ]

8 голосов
/ 18 апреля 2010

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

6 голосов
/ 18 апреля 2010

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

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

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

0 голосов
/ 18 сентября 2010

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

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

speedyPopulate() { 
  populate(); 
}

в классе MyOverlay

...