一尘不染

Android Google Map addMarker()添加400个标记时非常慢

java

感谢您抽出时间来阅读。

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

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

初始化地图后,将在地图片段的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

编辑:

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

以下是一些日志:

当屏幕由于加载标记而冻结了几秒钟(5-15)时,此日志的生成速度非常快。位图ID继续增加一,并且在加载标记时,会生成大约400个这些日志。这表明与在屏幕上加载标记位图有关必须是一个问题。我正在使用默认的标记位图。

   10-01 15:45:07.222: D/skia(32108): GFXPNG PNG bitmap created width:16 height:32 bitmap id is 414

应用完成将所有标记加载到地图后,将生成此日志。

10-01 15:51:09.402: I/Choreographer(8353): Skipped 1130 frames!  The application may be doing too much work on its main thread.

当应用程序将所有标记加载到地图上时,将生成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毫秒。

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


阅读 413

收藏
2020-12-03

共1个答案

一尘不染

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

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

BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)

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

BitmapDescriptorFactory.defaultMarker()

或使用自定义可绘制对象:

BitmapDescriptorFactory.fromResource(R.drawable.map_marker)

将默认标记与色调一起使用时,我发现速度降低了2000倍。我现在将自定义绘图作为解决方案。

2020-12-03