2011-06-23 33 views
3

我的活動中有一個方法用於下載一組文件。此下載是在我開始新活動時發生的。我使用線程,因爲它完全下載,而AsyncTask有時可能無法下載所有文件,它可能會卡在中間。在android中運行線程時顯示和解除進程對話框

現在,下載時會顯示黑屏。我想在ProgressDialog中顯示它,以便用戶可能會覺得某些內容正在下載。

我已經添加了ProgressDialog,但沒有顯示。誰能告訴我哪裏出錯了?

下面是我的代碼:

裏面onCreate()我已經寫:

downloadFiles(); 

private boolean downloadFiles() { 
    showProgressDialog(); 
    for(int i = 0; i < filesList.size();i++) { 
     Thread thread = new Thread(new Runnable() {  
      @Override 
      public void run() { 
       //downloading code 
     }); 
     thread.start(); 
     thread.run(); 
    } 
    dismissProgressDialog(); 
    return true; 
} 

//ProgressDialog progressDialog; I have declared earlier. 
private void showProgressDialog() { 
    progressDialog = new ProgressDialog(N12ReadScreenActivity.this); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    progressDialog.setMessage("Downloading files..."); 
    progressDialog.show(); 
} 

private void dismissProgressDialog() { 
    if(progressDialog != null) 
     progressDialog.dismiss(); 
} 
+1

也許這不會解決問題,但你爲什麼叫線程。跑()?你可以調用thread.start()並創建線程。我一直在使用AsyncTask來下載多個文件,從來沒有任何使用它的問題,更新UI線程也不是一件困難的事情。 – Egor

回答

0

請嘗試以下代碼。

private Handler responseHandler=null; 
downloadFiles(); 

private boolean downloadFiles() { 
    showProgressDialog(); 
    for(int i = 0; i < filesList.size();i++) { 
     Thread thread = new Thread(new Runnable() {  
      @Override 
      public void run() { 
       //downloading code 
       responseHandler.sendEmptyMessage(0); 
     }); 
     thread.start(); 
    } 

    responseHandler = new Handler() 
     {        
      public void handleMessage(Message msg) 
      { 
       super.handleMessage(msg); 
       try 
       { 
        dismissProgressDialog() 
       } 
       catch (Exception e) 
       { 
        e.printStackTrace(); 
       }      
      } 
     }; 
} 

在這段代碼中,當您的下載完成時,它會調用響應處理程序,並且您的進度對話框將消失。

+0

如果我錯了,請更正我的錯誤,但這會在第一個線程結束後關閉對話框。 – Flo

+0

yes在第一個線程完成後關閉對話框。你必須修改你的代碼,就像它會再次調用你的函數一樣...... –

0

在downloadFiles()中顯示對話框,然後啓動一些線程,並在啓動後,對話框被解除。我不認爲這是你想要的,因爲對話在最後一個線程開始之後關閉,而不是在最後一個線程結束之後關閉。

必須在最後一個線程完成其工作後調用dismissProgressDialog()方法。因此,在線程中運行的代碼的末尾,您必須檢查其他線程是否仍在運行,或者您是否可以關閉對話框,因爲沒有其他線程正在運行。

0

嘗試下面的代碼,讓我知道如何去:

private Handler mHandler = new Handler(){ 
    public void handleMessage(Message msg) 
    { 
     dismissProgressDialog() 
    } 
}; 

private boolean downloadFiles() { 
    showProgressDialog(); 
    for(int i = 0; i < filesList.size();i++) { 
     Thread thread = new Thread(new Runnable() {  
      @Override 
      public void run() { 
       //downloading code 
     }); 
     thread.start(); 
     thread.run(); 
    } 
    mHandler.sendEmptyMessage(0); 
    return true; 
} 

//ProgressDialog progressDialog; I have declared earlier. 
private void showProgressDialog() { 
    progressDialog = new ProgressDialog(N12ReadScreenActivity.this); 
    progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    progressDialog.setMessage("Downloading files..."); 
    progressDialog.show(); 
} 

private void dismissProgressDialog() { 
    if(progressDialog != null) 
     progressDialog.dismiss(); 
} 
1

試試這個..這很簡單

ProgressDialog progress = new ProgressDialog(this); 
progress.Indeterminate = true; 
progress.SetProgressStyle(ProgressDialogStyle.Spinner); 
progress.SetMessage("Downloading Files..."); 
progress.SetCancelable(false); 

RunOnUiThread(() => 
{ 
    progress.Show(); 
}); 
Task.Run(()=> 
//downloading code here... 
).ContinueWith(Result=>RunOnUiThread(()=>progress.Hide())); 
相關問題