感谢您抽出时间来阅读。
我大约在一个月前(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()
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倍。我现在将自定义绘图作为解决方案。