2016-09-22 2 views
0

で終了するのを待って、私は確認ダイアログを表示するために、これを呼び出しています:)doInBackground(上記の関数を呼び出した後アンドロイド:UIは私のAsyncTaskのdoInBackground機能では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(); 
     } 
    }); 
} 

を私は新しい活動を開始します。問題は、非同期なので、上記の関数が完了するのを待たないということです。私はちょうどポップアップを見ることができ、それは閉じる。これを解決するには?

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

編集:ちょうどポップアップし、消え、私はOKを押しすることは、まだ待たない

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)); 
    } 
} 

:私はこの関数を呼び出しています

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(); 
} 

+0

なぜバックグラウンドスレッドでダイアログを作成していますか? – tyczj

+0

実際に私はAsyncTaskでいくつかの石鹸作業を行い、作業が完了した後、ダイアログを表示して新しいアクティビティを開始する必要があります。そのダイアログがdoInBackgroundに表示されているときにエラーが表示されます –

+1

作業が完了したらダイアログを表示する必要がある場合は、メインスレッドにあるonPostExecuteを使用する必要がありますので、あなたの待ち時間を解決します – tyczj

答えて

1
非同期タスクにおける乗りonPostExecuteオーバー

、ダイアログとそれが

+0

私の編集した質問を参照してください –

+1

これは、両方のコード行を同時に呼び出しているからです。ダイアログメソッドを呼び出し、ダイアログのポジティブボタンのonClickメソッドでインテントコードを書き込みます。自動的に処理されます。 –

0

あなたの活動から

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(); 
    } 

} 

次に、あなたのAsyncTaskでこのような何かを行うことで目的のコードを記述

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がアクティビティのコンストラクタに渡すコールバックをトリガします。これにより、アクティビティ内ののダイアログが作成されます。 の肯定的なonClick応答では、新しいアクティビティがトリガされます。

最後に、命名規則を調べる必要があります。クラスは非常にUpperCamelCaseにする必要があります、彼らは重要です、人々が変数と混同されないようにしてください:)

関連する問題