簡體   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