繁体   English   中英

Google Maps v2 addPolygon()会插入UI线程,因此进度对话框不会设置动画

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM