2016-09-22 31 views
0

完成在我的AsyncTask的doInBackground功能,我打電話這顯示一個確認對話框:安卓:等待UI中的AsyncTask

void CreateOKDialog(final String message) 
{ 
    runOnUiThread(new Runnable() { 
     @Override 
     public void run() 
     { 
      AlertDialog.Builder builder = new AlertDialog.Builder(trip.this); 
      builder.setTitle(message); 
      builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
       } 
      }); 
      AlertDialog alert = builder.create(); 
      alert.show(); 
     } 
    }); 
} 

調用doInBackground上述功能()我開始一個新的活動後。問題是,由於它是異步的,它不會等待上述功能的完成。我只能看到一個彈出窗口並關閉。如何解決這個問題?

 CreateOKDialog("Trip cancelled"); 
     startActivity(new Intent(trip.this, login.class)); 

編輯:

void CreateOKDialog(String message) 
{ 
    AlertDialog.Builder builder = new AlertDialog.Builder(trip.this); 
    builder.setTitle(message); 
    builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      dialog.dismiss(); 
     } 
    }); 
    AlertDialog alert = builder.create(); 
    alert.show(); 
} 

我調用這個函數:

protected void onPostExecute(Void aVoid) { 
    super.onPostExecute(aVoid); 

    if(isError) 
     CreateOKDialog("Error cancelling trip"); 
    else { 
     CreateOKDialog("Trip cancelled"); 
     startActivity(new Intent(trip.this, login.class)); 
    } 
} 

它仍然沒有等我按OK,只是彈出和消失。

+0

你爲什麼要創建一個後臺線程的對話? – tyczj

+0

實際上我需要在AsyncTask中完成一些肥皂工作,然後工作完成後,向用戶顯示對話框並開始新的活動。它顯示了一個錯誤時,顯示在doInBackground –

+1

該對話框中,如果你需要顯示的對話框時,工作是你應該使用onPostExecute這是對故主線程解決您的等待問題做 – tyczj

回答

1

在在異步任務騎onPostExecute和寫入對話框和意圖代碼它

+0

見我的編輯問題 –

+1

這是因爲ü呼籲雙方同時代碼行。調用對話框方法,並在對話框的正面按鈕的onClick方法中寫入意圖代碼。它會自動處理。 –

0

從您的活動做這樣的事情與你的AsyncTask

public YourAsyncTask extends <X, Y, Z>{ 

    public interface TaskDoneCallback{ 
     void onTaskDone(); 
    } 

    private TaskDoneCallback mCallback; 

    public YourAsyncTask(TaskDoneCallback callback){ 
     mCallback = callback; 
    } 

    @Override 
    public Z doInBackground(X... params){ 
     // your stuff 
    } 

    @Override 
    protected void onPostExecute(Z result){ 
     if(mCallback != null) 
      mCallback.onTaskDone(); 
    } 

} 

然後

new YourAsyncTask(new TaskDoneCallback(){ 

    @Override 
    public void onTaskDone(){ 
     AlertDialog.Builder builder = new AlertDialog.Builder(trip.this); 
     builder.setTitle(message); 
     builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int which) { 
       dialog.dismiss(); 
       startActivity(new Intent(trip.this, login.class)); 
      } 
     }); 
     AlertDialog alert = builder.create(); 
     alert.show(); 
}).execute(x); 

發生的事情是AsyncTask將執行,並且onPostExecute它會觸發您傳遞給Activity的構造函數的回調。這將反過來在內建立對話框的活動。 然後在積極的onClick響應中,新的活動將被觸發。

最後,你會想看看命名約定。類應該非常所以要UpperCamelCase,它們是重要的,要讓人們沒有得到他們混淆變量:)