2011-11-01 21 views
1

我看了一些關於類似問題的其他問題,我發現我需要使用onProgressUpdate方法來更改ProgressDialog的消息。在使用AsyncTask時更改對話框消息?

例如,我有這樣的代碼在運行AsyncTaskdoInBackGround(這只是一個非常小的樣本):

 byte[] data = getBytesFromFile(image); 

     String lineEnd = "\r\n"; 
     String twoHyphens = "--"; 
     String boundary = "*****"; 
     pictures.dia.setProgress(30); 
     pictures.dia.setMessage("Data beginning upload sequence..."); 

     URL connectURL = new URL(this.base_url); 
     HttpURLConnection conn = (HttpURLConnection) connectURL.openConnection(); 
     conn.setDoInput(true); 
     conn.setDoOutput(true); 
     conn.setUseCaches(false); 
     conn.setRequestMethod("POST"); 

     conn.setRequestProperty("Connection", "Keep-Alive"); 
     conn.setRequestProperty("Content-Type", "multipart/form-data, boundary=" + boundary); 

     DataOutputStream dos = new DataOutputStream(conn.getOutputStream()); 
     pictures.dia.setProgress(40); 
     pictures.dia.setMessage("Output Stream prepared..."); 

當我最初這樣跑,我得到一個破窗戶錯誤說我不能在AsyncTask之外更改dia的消息。

所以我的問題是,當dia的進度達到一定數量時,如何使用onProgressUpdate設置消息dia? (即當dia的進度= 30時,說出「數據開始上傳順序...」)
onProgressUpdate必須明顯總是檢查dia的進度(就像聽衆,我想)[如果它不已經這樣做了,我該如何做到這一點?]

回答

5

您需要實施AsyncTaskonProgressUpdate方法。創建一個保存進度百分比的新類,該消息僅作爲onProgressUpdate方法的唯一參數。

在onProgressUpdate中,請撥打dia.setProgressdia.setMessage

在你的doInBackground方法中,調用publishProgress,其中包含新百分比和消息的新類的實例。這將導致AsyncTask在主線程上調用onProgressUpdate

例如:

private static class TaskProgress { 
    final int percentage; 
    final String message; 

    TaskProgress(int percentage, String message) { 
     this.percentage = percentage; 
     this.message = message; 
    } 
} 

在你的AsyncTask(更換s的正確類型的實現?):

public ProgressAsyncTask extends AsyncTask<?, TaskProgress, ?> { 

    public void onProgressUpdate(TaskProgress progress) { 
     pictures.dia.setProgress(progress.percentage); 
     pictures.dia.setMessage(progress.message); 
    } 

    public ? doInBackground(?... params) { 
     // ... your code  
     publishProgress(new TaskProgress(30, "A new update")); 
     // ... your code 
    } 

} 
+0

好的,我明白這是如何工作的。我現在有一個問題:當我把'publishProgress(新的TaskProgress(10,「Beginning sequence ...」));''在一些'runnable'的代碼中出現錯誤。我的runnable在'doInBackground'方法中調用,但實際上並不在那個方法中。另外,runnable稍後會從另一個類中調用另一個方法,我不能使用'publishProgress'。任何方式在這個? – Mxyk

+0

注意:如果我嘗試'Task.publishProgress(新的TaskProgress(10,「我的消息在這裏...」));',它表示publishProgress從AsyncTask不可見。不知道這是否有幫助。 – Mxyk

+0

您必須在doInBackground方法內調用publishProgress。 – Brigham

1

你在說的沒錯,你應該把代碼方法更新dia中的視圖。但是,要確保調用onProgressUpdate,您需要撥打publishProgress。基本上,您可以從後臺線程中調用publishProgress,然後系統將來會在未定義的時間在UI線程上調用onProgressUpdate。

+0

因此,而不是'pictures.dia.setProgress(某些數字)',我應該使用'publishProgress(某些數字)'?好的,從那裏開始,'onProgressUpdate'如何顯示我想要的正確信息? – Mxyk