android - ActionBar 进度微调器,同时将 1000 的标记添加到 android Googlemap

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

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

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

同时将标记添加到 map ,这需要 2 - 5 秒。 我的问题是:

  1. 我必须在 UI 线程上添加 1000 的标记。
  2. 不确定的微调器也在 UI 线程上运行,因此在添加 map 标记时它会“粘住”。

如何在其自己的线程中运行不确定微调器,使其不受添加到扩展 map 的 1000 个标记的影响? 我使用的扩展 map 设置是这些:

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 中添加了一个标记
<br/> .icon(BitmapDescriptorFactory.fromResource(R.drawable.my_drawable))<br/>
自定义标记图标
一旦我修改了我的代码以在我的 addMarker 循环之外执行此操作,我就达到了所需的响应时间。
感谢 MaciejGórski 促使我真正审视自己的代码。

最佳答案

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

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 中的进度微调器来构建代码。

关于android - ActionBar 进度微调器,同时将 1000 的标记添加到 android Googlemap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17856421/

相关文章:

javascript - 如何从webview返回android Activity 页面

android - 根据 View 焦点或滚动在 ConstraintLayout 内折叠布局

javascript - 将动态矩形限制为一个

android - Actionbar 列表导航宽度 - 换行内容

android - 如果我将警报管理器设置为特定时间运行,则必须在启动后检查

javascript - 为什么我的 map 在我的 jQuery Mobile/Google Maps API3 应用程序中居中?

android - 在 Android 的谷歌地图中添加了多少个最大标记?

java - Android:将相机图标添加到 android studio 上的操作栏

ActionBar 中的 Android 切换按钮

java - 无法解析方法 'assertThat(int)'