【发布时间】:2013-07-25 11:13:36
【问题描述】:
我有一个 Android 应用程序,可以将 1000 个标记添加到扩展的 GoogleMap 使用 Android 地图扩展程序。但是我想使用
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
在将标记添加到地图时需要 2 - 5 秒。 我的问题是:
- 我必须在 UI 线程上添加 1000 的标记。
- 不确定的微调器也在 UI 线程上运行,因此在添加地图标记时它会“粘住”。
如何在自己的线程中运行不确定微调器,使其不受添加到扩展地图的 1000 个标记的影响? 我使用的扩展地图设置如下:
final FragmentManager fm = getSupportFragmentManager();
final SupportMapFragment f = (SupportMapFragment) fm.findFragmentById(R.id.map);
mGoogleMap = f.getExtendedMap();
final ClusteringSettings settings = new ClusteringSettings();
settings.iconDataProvider(new TowerIconDataProvider(getResources()));
settings.addMarkersDynamically(true);
mGoogleMap.setClustering(settings);
更新
我发现了我的addMarker()的根本原因
性能问题;我打电话给我的 GoogleMap 的每个计时器都添加了一个标记
.icon(BitmapDescriptorFactory.fromResource(R.drawable.my_drawable))
自定义标记图标
一旦我修改了我的代码以在我的 addMarker 循环之外执行此操作,我就达到了所需的响应时间。
感谢 MaciejGórski 推动我真正审视自己的代码。
【问题讨论】:
-
什么需要 2-5 秒?如果您从 Android Maps Extensions Demo application 运行
Grid clustering (dynamic)示例,它会在几百毫秒内增加 20kMarkers。 -
我的应用程序必须等待使用 mLocationClient = new LocationClient(this, this, this); 找到您的当前位置然后从 sqlite 数据库中检索大约 10,000 行以获得纬度/经度对以在 GoogleMap 上绘制,然后为每一个添加标记,这样需要几百毫秒。演示中的标记位于 lat long 对的静态数组中。此外,我的应用程序会计算从您当前位置到从 sqlite 数据库中检索到的每个纬度/经度对的距离。
-
从
LocationClient获取Location是异步的,在您之前的问题中,您说您正在AsyncTask中读取数据库。这些操作可能完全需要几秒钟,但不会阻塞 UI。您是在调用setClustering之前或之后添加Markers 吗? -
我从 locationClient 获取 Location,然后 setClustering,然后检索 sqlite 行,然后添加标记,当这一切发生时,我需要一个进度微调器。添加最后一个标记后,进度微调器将被关闭。我想使用谨慎的操作栏微调器,但这会阻塞,因为我还必须在操作栏微调器执行时在同一个 ui 线程上添加标记。
-
当多个“后台”任务完成时,真的没有办法显示进度对话框(不断旋转)吗?
标签: android google-maps android-actionbar android-maps-extensions