【问题标题】:Android Map Performance poor because of many Overlays?由于许多叠加层,Android 地图性能不佳?
【发布时间】:2011-02-09 05:27:15
【问题描述】:

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

【问题讨论】:

    标签: android performance map overlay


    【解决方案1】:

    如果我理解这是如何正常工作的,那么您不应该在每次添加叠加层后调用 populate。将它们全部添加后,您应该这样做。我认为发生的事情是您添加第一个 OverlayItem 并调用 populate() 所以它会将其添加到 ItemizedOverlay. 然后您将第二个 OverlayItem 添加到列表中并调用 populate() 并添加那些 两个 叠加到ItemizedOverlay 导致叠加中的三个 项。所以我认为你得到的结果远远超过你想象的 20-50。

    【讨论】:

    • 不仅如此,您还可以在叠加层中拥有多个标记。编写伪代码的方式是,您为每个标记添加一次相同的叠加层 -- mapOverlays.add(itemizedOverlay); -- 这并不能完全帮助您。
    • 对我来说也会很有趣。
    【解决方案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();
    }
    

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

    【讨论】:

    • 这种方式好多了。非常感谢你! :-)
    【解决方案3】:

    我昨晚遇到了同样的问题,我的解决方案和你的一样。我对调用 populate 方法的方式感到奇怪。

    我的代码和你一样,但我打了电话

    speedyPopulate() { 
      populate(); 
    }
    

    在 MyOverlay 类中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多