2011-08-16 56 views
0

我正在使用AsyncTask來處理複雜的後臺操作(編譯要發送的日誌文件),並使用ProgressDialog顯示用戶進度。我曾嘗試使用showDialog(),但它似乎從來沒有顯示或解僱(它從來沒有被稱爲),我遵循教程如何做到這一點... 所以我使用非託管的,它不會解僱我的消息。我也想更新消息,因爲它開始編譯日誌文件(因爲它似乎滯後於此 - 或者文本視圖很長,所以它不會像它應該更新的那樣)。AsyncTask中的ProgressDialog不更新或解僱

我已經移動了我的代碼,所以它看起來像有問題(如onProgressUpdate()),但我不知道如何使它工作。我環顧這個網站,似乎沒有任何問題,我(不完全是反正)。 RunOnUiThread()不起作用,新的Thread(){}不起作用,onProgressUpdate()我無法工作(文檔在這方面令人困惑)。

它也從未解僱。我建立了一個傾聽者,而且從不解散。

有人知道我的代碼有什麼問題嗎?我認爲AsyncTask應該很簡單。

 private class BuildLogTask extends AsyncTask<Void, Void, String> { 
     String temp; 
     ProgressDialog progressdialog = new ProgressDialog(context); //variable is defined at onCreate (held as private, not static) 

     @Override 
     protected String doInBackground(Void... params) { 
      temp = buildLog(); 
      logdata = temp; 
      publishProgress(); 
      createLogFile(); 
      return temp; 
     } 

     protected void onProgressUpdate() { 
      progressdialog.setMessage("Compiling Log File..."); 
     } 

     @Override 
     protected void onPreExecute() { 
      Log.w(TAG,"Showing Dialog"); 
      send.setEnabled(false); 
      ProgressDialog progressdialog = new ProgressDialog(context); 
      progressdialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
      progressdialog.setMessage("Gathering Data..."); 
      progressdialog.setCancelable(false); 
      progressdialog.setOnDismissListener(new DialogInterface.OnDismissListener() { 

       @Override 
       public void onDismiss(DialogInterface dialog) { 
        Log.e(TAG,"Progress Dialog dismissal."); 

       } 
      }); 
      progressdialog.show(); 
     } 

     @Override 
     protected void onCancelled(){ 
      Log.e(TAG,"Progress Dialog was Cancelled"); 
      progressdialog.dismiss(); 
      logdata=null; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      progressdialog.dismiss(); 
      send.setEnabled(true); 
      previewAndSend(); 
     } 

    } 

回答

2

你有兩個不同的進度對話框出現,一個地方到onPreExecute()和一個全局。你在onPostExecution()中的一個解散是你的全球實際上從未實際顯示的。刪除本地聲明,它應該工作。

+0

是的......就是這樣。 現在我覺得啞巴!雖然謝謝! – Mgamerz

0

有兩個問題。

  1. onProgressUpdate的簽名不正確。試試這個:

    @Override protected void onProgressUpdate(Void ... progress){ progressdialog.setMessage(「Compiling Log File ...」); }

  2. 你是一個局部變量掩蓋progressDialog成員變量在onPreExecute()

編輯:確定問題二:

+0

不幸的是,這不起作用(像我嘗試過的所有其他方法)。進度對話框的消息不會更新,也不會消除。 – Mgamerz

+0

嗯......這很奇怪。你是否嘗試過將Progress參數類型從Void改爲Integer(詳見我上面的編輯?) – Jason

+0

沒關係,我看到你的問題。你用'onPreExecute()' – Jason

0

試試吧,

替換:

progressdialog.show(); 

爲:

progressdialog = progressdialog.show(); 

好運。