【问题标题】:ActionBar progress spinner while Adding 1000's Markers to android Googlemap将 1000 个标记添加到 android Googlemap 时的 ActionBar 进度微调器
【发布时间】:2013-07-25 11:13:36
【问题描述】:

我有一个 Android 应用程序,可以将 1000 个标记添加到扩展的 GoogleMap 使用 Android 地图扩展程序。但是我想使用

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

在将标记添加到地图时需要 2 - 5 秒。 我的问题是:

  1. 我必须在 UI 线程上添加 1000 的标记。
  2. 不确定的微调器也在 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) 示例,它会在几百毫秒内增加 20k Markers。
  • 我的应用程序必须等待使用 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


【解决方案1】:

如果ActionBar 中的进度微调器类似于ProgressDialog,那么是的,它必须在自己的线程中运行才能工作。幸运的是,AsyncTask 让这变得非常容易。我建议的一个改进是在后台线程中完成繁重的工作。您可以首先在AsyncTask 中进行所有数据库查找等。您仍然可以在 UI 线程上添加标记,但所有数据处理都将在后台线程上完成。 onPreExeecute()onProgressUpdate()onPostExecute() 都在 UI 线程上执行,因此在那里进行 UI 操作是安全的。看看这个 sn-p:

private class SetMarkersTask extends AsyncTask<Void, Marker, Void> 
{
     protected void onPreExecute() 
     {
         // Turn progress spinner on
         setProgressBarIndeterminateVisibility(false);
     }

     protected Void doInBackground(Void... params) 
     {
         // Does NOT run on UI thread
         // Long-running operation here; create a marker
         publishProgress(myMarker);
     }

     protected void onProgressUpdate(Marker... params) 
     {
         // Add newly-created marker to map
         addMarker(params[0]);
     }

     protected void onPostExecute(Void result) 
     {
         // Turn off progress spinner
         setProgressBarIndeterminateVisibility(false);
     }
 }

这可能不是您所需要的,但它应该让您了解如何使用ActionBar 中的进度微调器来构建您的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多