2013-12-08 36 views
2

我有一個AsyncTask<Client, Void, Boolean>調用LoginTaskProgressDialog,你可以在這裏看到。 現在我的問題是,如果我使用LoginTask(...).execute().get()啓動此任務,ProgressDialog僅在AsyncTask的末尾顯示爲非常短。另外,我已經加入了一些Thread.sleep(),但如果我這樣做,我還會在線程結束時獲得一個ProgressDialogAsyncTask中的ProgressDialog僅在短時間內顯示在任務結束時

ProgressDialog如何顯示整個異步任務?

public class LoginTask extends AsyncTask<Client, Void, Boolean> 
    { 
     private ProgressDialog progressDialog; 
     private MainActivity activity; 

     public LoginTask(MainActivity activity) 
     { 
    this.activity = activity; 
    } 

    @Override 
    protected void onPreExecute() 
    { 
    progressDialog = new ProgressDialog(activity); 
    progressDialog.setIndeterminate(true); 
    progressDialog.setMessage(activity.getText(R.string.asynctask_login_connect)); 
    progressDialog.setCancelable(false); 
    progressDialog.show(); 
    } 

    @Override 
    protected Boolean doInBackground(Client... params) 
    { 
    try 
    { 
     Client client = params[0]; 
     if (client.connect()) 
     { 
     progressDialog.setMessage(activity.getText(R.string.asynctask_login)); 
     if (client.manageHandshake()) 
     { 
      return true; 
     } 
     else 
      return false; 
     } 
     else 
     return false; 
    } 
    catch (Exception e) 
    { 
     Log.e(LoginTask.class.getSimpleName(), "Can not handshake and connect to/with server.", e); 
     return false; 
    } 
    } 

    @Override 
    protected void onPostExecute(Boolean result) 
    { 
    progressDialog.dismiss(); 
    } 

} 
+0

您爲什麼要調用get方法?使用onPostExecute從doInBackground獲取結果將顯示progressDialog直到doInBackground未完成 –

+0

@ρяσѕρєяK我不完全明白。我得到的結果int onPostExecute,但該怎麼做呢?你能舉個例子嗎? –

+1

啓動AsyncTask'LoginTask(...)。execute()'而不是'LoginTask(...)。execute()。get()'並移動你想在從onPostExecute獲得服務器結果後執行的代碼 –

回答

2

從一開始()的文檔,

如有必要,等待計算完成,然後檢索 其結果。

這意味着它將阻止調用Thread直到執行完成;這違背了使用AsyncTask的全部目的。只需撥打​​並更新UI ThreadonPostExecute()

相關問題