[英]Google Maps Android API v2 doesn't show up in my Developer's Console
[英]Google Maps v2 addPolygon() plugs up UI thread so my progress dialog doesn't animate
我正在开发一个应用程序,在该应用程序中,我希望能够将多达10,000个多边形(40,000个纬度/经度对)加载到Google Maps v2上,并且性能几乎可以接受。 但是由于加载大约需要20秒,因此我需要有一个进度指示器,以使它看起来好像应用程序没有锁定。
我相信核心问题是我必须重复10,000次并且必须在UI线程上运行的map.addPolygon(polygonOptions)调用会堵塞UI线程,这样进度对话框就没有时间更新其UI。 这是我的代码的近似值:
@Override
protected void onCreate(.....) {
progressDialog = new ProgressDialog(AllLayersActivity.this);
progressDialog.setMessage("Processing files:");
progressDialog.setTitle("Loading data");
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setProgress(0);
progressDialog.setMax(1);
progressDialog.show();
progressDialog.incrementProgressBy(1);
for(String filename : intent.getStringArrayListExtra(DbxService.PARAM_FILES)) {
if(filename.toLowerCase(Locale.getDefault()).endsWith(".shp")) {
dbxService.getFileContents(new DbxPath(pathToField + filename));
}
}
}
BroadcastReceiver for dbxService.getFileContents() {
new Thread(new Runnable() {
@Override
public void run() {
byte[] fileContents = loadFromBroadcastIntent(.....);
progressDialog.setMax(progressDialog.getMax() + getNumberOfParts(fileContents));
// bunch of other processing
for(Part part : getParts(fileContents) {
final PolygonOptions polygonOptions = new PolygonOptions();
// processing stuff
polygonOptions.addAll(latLngList);
runOnUiThread(new Runnable() {
public void run() {
map.addPolygon(polygonOptions);
progressDialog.incrementProgressBy(1);
if(progressDialog.getProgress() == progressDialog.getMax()) {
progressDialog.dismiss();
}
}
});
}
}
}).start();
}
我知道即时增加ProgressDialog的最大值可能看起来有点怪异,但我认为它在实践中应该可以很好地工作,因为progressDialog.setMax(progressDialog.getMax() + parts);
该行的运行次数比progressDialog.incrementProgressBy(1);
少很多倍progressDialog.incrementProgressBy(1);
行,总是在对话框可能错误地达到100%之前添加更多,并且应该很快增加到其最终值,因为map.addPolygon(polygonOptions);
到目前为止,这是我做得最慢的事情。
那么,我该怎么做才能让进度条很好地进行动画处理?
我将添加此内容作为评论,但我的代表不到50个,所以还不能。 话虽如此,我有一个应用程序可以在地图上添加多达10,000个标记,而我遇到了同样的问题。 我尝试在另一个线程中添加标记,但是必须在UI线程中将项目添加到地图中,该UI线程与progressDialog相同。 因此,简短的答案是“否”。如果在那里有人比我更聪明,那么可以在AsyncTask或Runnable中做到这一点,那么请让我知道!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.