2012-09-11 78 views
1

因此,在我的對話框中,我有一個按鈕啓動Asynctask下載器從我的服務器獲取某個文件;而且工作得很好。但是,我想關閉當前的對話框並在點擊按鈕上顯示ProgressDialog。我將如何處理這個問題?Android對話框和AsyncTask導致UI凍結

目前,如果我點擊按鈕(我的對話框中的一個元素),整個UI會在下載器從服務器下載文件時凍結。下載程序完成其任務後,進度對話框將顯示。

我的代碼看起來是這樣的

MainActivity{ 

    Dialog dialog; 
    ProgressDialog progress; 

    onCreate(){ 
     dialog = new Dialog(this); 
     progress = new ProgressDialog(this); 
     dialog.setContentView(Some View Resource With My Button); 
     someMethod(); 
     dialog.show(); 
    } 

    someMethod(){ 
     Button button = (Button) dialog.findViewById(resource of button); 
     button.setOnClickListener(new OnClickListener(){ 

      onClick(){ 
       dialog.dismiss(); 
       progress.show(); 
       new DownloaderAsyncTask(progress).execute().get(); 
      } 

        //go to another activity when download finished 

     }); 
    } 

    private class DownloaderAsyncTask extends AsyncTask<Void, Void, Void>{ 

     ProgressDialog progress; 

     DownloaderAsyncTask(ProgressDialog progress){ 
      this.progress = progress; 
     } 

     doInBackGround(){ 
      //Downloading 
     } 

     onPostExecute(){ 
      //Kill connection 
      this.progress.dismiss(); 
     } 

    } 

} 

感謝。請讓我知道,如果你們需要任何額外的信息。

+0

顯示您的logcat –

+0

沒有錯誤。用戶界面被凍結,因爲它正在等待下載器完成。下載器完成後,一切正常。但是,我希望當前的對話框被忽略,並且只要單擊該按鈕,就會顯示progressDialog。 – Infinity

+0

不要調用'get()'。看到答案。 –

回答

6
new DownloaderAsyncTask(progress).execute().get(); 

我真的不知道爲什麼AsyncTaskget()方法 - 它基本上變成異步處理成一個同步,因爲它會阻止並等待結果。這就是UI凍結的原因。

如果您想等待下載器完成並執行其他操作,那麼這就是onPostExecute(...)的作用。

+0

+1爲什麼goog會這麼做? – o0rebelious0o

2

你的UI線程被凍結,因爲你叫get()。不要那樣做。相反,啓動您AsyncTask,幷包含你想在下載結束執行,這樣的代碼你onPostExecute()調用方法(增加/減少):

someMethod() { 
     Button button = (Button) dialog.findViewById(resource of button); 
     button.setOnClickListener(new OnClickListener(){ 

      onClick(){ 
       dialog.dismiss(); 
       progress.show(); 
       new DownloaderAsyncTask().execute(); 
      } 
     }); 

private void downloaderFinished() { 
    this.progress.dismiss(); 
    /// go to next activity. 
} 

private class DownloaderAsyncTask extends AsyncTask<Void, Void, Void>{ 

     doInBackGround(){ 
      //Downloading 
     } 

     onPostExecute(){ 
      //Kill connection 
      downloaderFinished(); 
     } 
    } 

那怎麼應當做到爲async代表,好了,異步,因此致電get()殺死所有好處。