2010-04-17 66 views
5

我在我的android应用程序中有一个显示许多标记(〜20-50)的地图。但是,当我尝试滚动/缩放时,该应用的性能非常差(在Google Android Maps中,我做了一个比萨饼示例搜索,并且发现了20-50个结果,并且在缩放/滚动时没有注意到任何特定的性能问题地图)。Android地图性能很差,因为有很多覆盖?

这里是我的(伪)代码:

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

回答

8

如果我理解它是如何工作正常,你不应该在每次添加叠加后调用填充。一旦你全部加入,你应该做。我认为发生的事情是,你添加的第一个OverlayItem并调用populate()所以它补充说,到ItemizedOverlay.然后添加第二个OverlayItem到列表和电话populate(),并将其添加这些覆盖到ItemizedOverlay导致项目在覆盖。所以我认为你的想法超过了20-50。

+0

不仅如此叫

speedyPopulate() { populate(); } 

,但你可以在覆盖多个标记。你的伪代码被写入的方式,你添加*相同的覆盖*每个标记一次 - 'mapOverlays.add(itemizedOverlay);' - 这不会帮助你。 – CommonsWare 2010-04-17 20:37:27

+1

我该如何让这更好? – Dave 2010-04-17 21:07:52

+0

我也会很感兴趣。 – 2012-12-05 16:21:35

6

我已经做了,现在下面,它工作快速(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(); 
} 

现在这更好的/正确吗?或可能的其他改进?

+0

很多,这种方式好多了。非常感谢你! :-) – 2012-12-05 16:21:15

0

昨晚我遇到了同样的问题,我的解决方案和你的一样。我对我如何称为填充方法感到很奇怪。

我有同样的代码,你,但我在MyOverlay类