2015-11-03 63 views
6

我有這個類從一個片段被調用。進度更新被調用,但消息不會更新。我也沒有看到任何進度條或微調。只是標題和消息,看到了一些類似的問題,但沒有進展欄根本沒有顯示。此外,我的消息在onProgressUpdate中根本不會更新,但打印出的值確實表明它在onProgressUpdate內增加。進度對話框顯示,但沒有進度條顯示和消息不更新

編輯:這裏是我開始工作

DownloadFilesTask download = new DownloadFilesTask(); 
download.execute(urls.toArray(new String[urls.size()])); 

這裏是類

private class DownloadFilesTask extends AsyncTask<String, Integer, Long> { 

ProgressDialog progressDialog; 

@Override 
protected void onPreExecute() 
{ 
    progressDialog = ProgressDialog.show(getActivity(), "Downloading","Downloaded 0/"+urls.size(), false); 
    progressDialog.setProgress(0); 
    progressDialog.setMax(urls.size()); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
} 

@Override 
protected Long doInBackground(String[] urls) { 
    int count = urls.length; 
    long totalSize = 0; 
    for (int i = 0; i < count; i++) { 
      //Do things in background here 
      publishProgress(new Integer[] {i}); 
    } 
    return totalSize; 
} 

@Override 
protected void onProgressUpdate(final Integer... progress) { 
    System.out.println(progress[0]); //This does print correctly 
    getActivity().runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      progressDialog.setProgress(progress[0]); 
      progressDialog.setMessage("Downloaded "+ progress[0] +"/"+urls.size()); 
     } 
    }); 
} 

@Override 
protected void onPostExecute(Long result) { 
    progressDialog.dismiss(); 
    Toast t = Toast.makeText(getActivity(), "Downloaded", Toast.LENGTH_LONG); 
    t.show(); 
} 

}

+1

您是如何開始執行任務的,請顯示代碼。 – starkshang

+0

編輯它以顯示我啓動它的方式,它只是您開始任務的通用方式,這就是爲什麼我沒有包含它。這些幫助有用? – Zach

回答

3

問題在於您的ProgressDialog被初始化的方式。

這個替換您onPreExecute:

@Override 
protected void onPreExecute() { 
    progressDialog = new ProgressDialog(activity); 
    progressDialog.setTitle("Downloading"); 
    progressDialog.setMessage("Downloaded 0/" + urls.size()); 
    progressDialog.setIndeterminate(false); 
    progressDialog.setProgress(0); 
    progressDialog.setMax(urls.size()); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
    progressDialog.show(); 
} 

從本質上講,你需要在調用前戲叫setProgressStyle

此外,您可以刪除onProgressUpdate中的runOnUiThread代碼,因爲onProgressUpdate在UI線程上被調用。

+0

哇的末尾調用'show()',這個簡單的問題。非常感謝,當我可以〜22小時左右時獎勵賞金 – Zach

+1

很高興幫助 - 這是一個棘手的錯誤。如果您有興趣,請查看ProgressDialog源代碼 - 您將看到爲什麼您遇到此問題。 https://github.com/android/platform_frameworks_base/blob/master/core/java/android/app/ProgressDialog.java#L324 – Aaron

0

不知道確切原因,但它不需要setProgressrunnable as onProgressUpdate將在UI線程上運行。

嘗試

progressDialog.setProgress(progress[0]); progressDialog.setMessage("Downloaded "+ progress[0] +"/"+urls.size());

而且更換

getActivity().runOnUiThread(new Runnable() { @Override public void run() { progressDialog.setProgress(progress[0]); progressDialog.setMessage("Downloaded "+ progress[0] +"/"+urls.size()); } });

- 你在做doInbackground()聯網的東西,否則我們看不到,這將在onPostExecute()被解僱的進展。

+0

我之前確實曾經這樣做過,但它並沒有工作,所以我決定嘗試runonuithread。我正在下載圖片,因此需要一段時間。對話框顯示,但沒有進度條,只是標題。一旦它完成下載圖像關閉就好了 – Zach

+0

好的。可以嘗試初始化進度對話框,然後在'onPreExecute()' – sha