当前位置: 首页 > 面试题库 >

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

慕容铭
2023-03-14
问题内容

感谢您抽出时间来阅读。

我大约在一个月前(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:

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倍。我现在将自定义绘图作为解决方案。



 类似资料:
  • 这是我的代码从标题 我没有活动插件。wp_head有两个过滤器-没有一个用于显示“title”,整个主题代码中也没有其他wp_title或“title”。 关于如何删除第二个标题有什么想法吗?

  • 我有一个函数,以一个地名作为输入,并在谷歌地图上那个地方的lat和lng位置下降一个pin。它还使用lat和lng位置设置边界,将pin设置为Viewport。一切都很好,但旧的标记没有得到清除,而添加一个新的标记。我已经清除了标记数组,但它不起作用。这是我的代码

  • 在我的应用程序中,我使用的是谷歌地图,首先我是通过标记显示用户当前的位置,并通过一个透明的圆圈显示其准确性,现在当我想添加另一个标记到代表我以前的位置的同一点时,相同的代码对我不起作用,请有人帮我找出代码的错误,我只是想在一个地图视图中添加多个标记 下面是我用来显示两个标记的代码:- 通过使用MapOverlay类,我可以在地图上放置一个显示用户当前位置的pin,但当我使用MapOverlay1显

  • 我在视图中使用mapbox,需要从JSON添加多个标记 这是我的JSON 下面是我如何运行脚本添加地图到视图 但是我想知道,我如何需要添加标记到map(对于json中的每个元素,我需要获得lat和lon)来映射。因为医生说我需要这样的Json var Geojson={type:'FeatureCollection',特性:[{type:'Feature',几何:{type:'Point',坐标:

  • 问题内容: 我在使用此逻辑时遇到麻烦,因为react / jsx不允许将非结束标记添加到数组/子组件。例如,使用bootstrap CSS,我想为 每 4列添加一行。 因此逻辑如下: 添加一个开头行ex:,然后在该行内循环,并在每个循环后添加一列ex:当该循环达到4时,在添加新的行标记时检查并添加一个结束标记; 下面的代码 _ 可以_ 用另一种语言工作,但是由于我们按下了结束标记和开始标记(这是无

  • 您好,我是Hibernate的新手,我正在试图理解它是如何工作的,所以我制作了一个servlet来用Hibernate建立到DB的连接。在向configuration.cfg.xml添加一个hbm文件之前,一切都很好。我无法解释为什么当我添加这个时servlet会崩溃。 我的目录如下: hibernate.cfg.xml文件: 编辑:下面是stacktrace类型异常报告 实例化servlet类s