ActionBar进度微调器,同时将1000的标记添加到Android谷歌地图

时间:2013-07-25 11:13:37

标签: android google-maps android-actionbar android-maps-extensions

我有一个Android应用程序,可以向扩展的GoogleMap添加1000个标记 使用Android Maps Extensions。不过我想用

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

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

  1. 我必须在UI线程上添加1000个标记。
  2. 不确定的微调器也在UI线程上运行,因此在添加地图标记时它会“粘住”。
  3. 如何在自己的线程中运行不确定的微调器,以便它不受添加到扩展映射的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让我真正看看自己的代码。

1 个答案:

答案 0 :(得分: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内的进度微调器来构建代码。