3

我有一个 Android 应用程序,可以使用 Android Maps Extensions 将 1000 个标记添加到 Extended GoogleMap。但是我想使用

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 中添加了一个标记,我调用 它来自定义标记图标 一旦我修改了我的代码以在我的 addMarker 循环之外执行此操作,我就达到了所需的响应时间。 感谢 MaciejGórski 推动我真正审视自己的代码。

.icon(BitmapDescriptorFactory.fromResource(R.drawable.my_drawable))



4

1 回答 1

1

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

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

于 2013-07-26T12:36:48.863 回答