我有一个Android应用程序,可以向扩展的GoogleMap添加1000个标记 使用Android Maps Extensions。不过我想用
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
将标记添加到地图中需要2到5秒。 我的问题是:
如何在自己的线程中运行不确定的微调器,以便它不受添加到扩展映射的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让我真正看看自己的代码。
答案 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
内的进度微调器来构建代码。