我有一个安卓应用程序,它可以使用Android扩展将1000个标记添加到扩展的GoogleMap中。不过,我想用
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促使我认真研究自己的代码。
发布于 2013-07-26 12:36:48
如果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内部的进度旋转器来构造代码。
https://stackoverflow.com/questions/17856421
复制相似问题