感谢您抽出时间来阅读。

我大约一个月前(2014年8月29日)在Google Play商店中发布了一个应用,而使用相同数量的标记并不是问题。本周,我注意到当我进入应用程序时,在我的Galaxy S5上将400个标记加载到 map 上花费了大约10-20秒,并且默认 map 标记图标中间有一个小圆圈。在此之前, map 加载时间不到一秒钟。我尚未更新或更改我的应用程序。我猜想Google更新了Google Map API,而更改使加载标记的速度变慢了吗?这有发生在其他人身上吗?有人知道这件事吗?

我的应用可在Play商店免费获得。如果要查看加载速度如何,可以搜索《纽约运河指南》以查找它。

初始化 map 后,将在 map 片段的onCreateView()中调用此方法:

    private void addExistingMarkersToMap(){
    log("Adding existing markers to the map. poiAdapter size = " + poiAdapter.getCount());
    Marker marker;
    MarkerOptions markerOptions;

    for(MapMarker mapMarker : poiAdapter){
        if(markersNotFilteredOut(mapMarker)){
            markerOptions = mapMarker.getMarkerOptions();

            if(markerOptions != null && mapMarker != null){
                marker = mMap.addMarker(markerOptions);
                mapMarker.setMarker(marker);
            }
        }
    }
}

这是MapMarker类上的getMarkerOptions()方法:
public MarkerOptions getMarkerOptions() {
    return new MarkerOptions()
    .title(name)
    .position(new LatLng(lat, lng))
    .snippet(bodyOfWater + ", mile " + mile)
    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE));
}

完整的源代码在这里:github.com/olearyj234/NYS-Canal-Guide

编辑:

**具体来说,唯一缓慢的部分是初始化 map 时加载标记(从一个导航选项卡切换回 map 选项卡时也是如此)。移动 map 或其他任何东西时,它并不慢。

以下是一些日志:

当屏幕由于加载标记而冻结了几秒钟(5-15)时,此日志的生成速度非常快。位图ID继续增加1,并且在加载标记时,会生成大约400个这些日志。这表明与在屏幕上加载标记位图有关必须是一个问题。我正在使用默认标记位图。
   10-01 15:45:07.222: D/skia(32108): GFXPNG PNG bitmap created width:16 height:32 bitmap id is 414

应用完成将所有标记加载到 map 后,将生成此日志。
10-01 15:51:09.402: I/Choreographer(8353): Skipped 1130 frames!  The application may be doing too much work on its main thread.

当应用程序将所有标记加载到 map 上时,将生成14次此日志。
10-01 15:59:13.882: I/dalvikvm-heap(8353): Grow heap (frag case) to 40.668MB for 4194320-byte allocation

编辑2:

我只是检查了某些代码行需要花费多长时间。我使用System.currentTimeMillis();来获取时间。在addExistingMarkersToMap()方法中,这是花了很长时间的行:marker = mMap.addMarker(markerOptions);当添加所有400个标记时,每个标记平均花费54毫秒。最小时间为34毫秒,最大时间为114毫秒。

如果您认为我应该提供更多信息,请在评论中告诉我。
谢谢!

最佳答案

这似乎是Google Maps API v2中引入的一个新问题(看起来像是Play Services 6的更新之一),请参阅#7174了解更多信息(而请给它加注)。

从问题中提供的信息来看,问题似乎特定于使用带有色相的默认标记,例如:

BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)

有一些解决方法。最简单的方法是不提供色相(如果所有标记都为红色,则可以接受):
BitmapDescriptorFactory.defaultMarker()

或使用自定义可绘制对象:
BitmapDescriptorFactory.fromResource(R.drawable.map_marker)

使用带有色相的默认标记时,我看到速度降低了2000倍。我现在将自定义绘图作为解决方案。

07-24 09:49
查看更多