感谢您抽出宝贵时间阅读本文。
我在大约一个月前(2014 年 8 月 29 日)向 Google Play 商店发布了一个应用,使用相同数量的标记时这不是问题。本周,当我进入我的应用程序时,我注意到在我的 Galaxy S5 上将 400 个标记加载到 map 上大约需要 10-20 秒,并且默认 map 标记图标中间有一个小圆圈。在此之前, map 加载不到一秒钟。我没有更新或更改我的应用程序。我猜谷歌更新了谷歌地图 API,这个改变使得加载标记的速度慢了很多?这有发生在其他人身上吗?其他人有这方面的信息吗?
我的应用可在 Play 商店免费下载。如果您想查看加载速度有多慢,可以搜索 NYS Canal Guide 找到它。
map 初始化后在 map fragment 的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 ms对于每个标记。最短34ms,最长114ms。
如果您认为我应该提供更多信息,请在评论中告诉我。 谢谢!
最佳答案
这似乎是 Google Maps API v2 中引入的一个新问题(看起来像是 Play Services 6 更新之一),请参阅 #7174了解更多信息(请加注星标)。
从问题中提供的信息来看,问题似乎是特定于使用带有色调的默认标记,例如:
BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE)
有一些解决方法。最简单的是不提供色调(如果您的所有标记都是红色的):
BitmapDescriptorFactory.defaultMarker()
或者使用自定义drawable:
BitmapDescriptorFactory.fromResource(R.drawable.map_marker)
使用带有色调的默认标记时,我发现速度降低了约 2000 倍。我现在将使用自定义可绘制对象作为解决方案。
关于java - 添加 400 个标记时,Android Google Map addMarker() 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26110763/
当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/
我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www
当谈到运行时自省(introspection)和动态代码生成时,我认为ruby没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资
我注意到类定义,如果我打开classMyClass,并在不覆盖的情况下添加一些东西我仍然得到了之前定义的原始方法。添加的新语句扩充了现有语句。但是对于方法定义,我仍然想要与类定义相同的行为,但是当我打开defmy_method时似乎,def中的现有语句和end被覆盖了,我需要重写一遍。那么有什么方法可以使方法定义的行为与定义相同,类似于super,但不一定是子类? 最佳答案 我想您正在寻找alias_method:classAalias_method:old_func,:funcdeffuncold_func#similartoca
我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht