我有一个 Android 应用程序,可以将 1000 个标记添加到扩展的 GoogleMap 使用 Android map 扩展。但是我想用
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
同时将标记添加到 map ,这需要 2 - 5 秒。 我的问题是:
- 我必须在 UI 线程上添加 1000 的标记。
- 不确定的微调器也在 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/