У меня есть карта в моем приложении андроида, которое показывает много маркеров (~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();
}
Я сделал следующее, и это работает быстро (эээ):
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();
}
это лучше / правильно сейчас? или какие-либо другие возможные улучшения?
Если я понимаю, как это работает правильно, вам не следует вызывать populate после каждого добавления оверлея. Вы должны сделать это после того, как добавите их все.Я думаю, что происходит то, что вы добавляете первый OverlayItem
и вызываете populate ()
, поэтому он добавляет его к ItemizedOverlay.
Затем вы добавляете второй OverlayItem
в список и вызываете populate ()
, и он добавляет эти два оверлея в ItemizedOverlay
в результате получается три элемента наложения. Так что я думаю, вы получаете больше, чем 20-50, как вы думаете.