2016-09-22 4 views
0

В моей функции doInBackground AsyncTask, я звоню, чтобы это окно подтверждения:Android: Ждите 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)); 

Edit:

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 это вызовет обратный вызов, который вы передадите конструктору для своей деятельности. Это, в свою очередь, построит диалог от в пределах активности. Затем в положительном ответе onClick будет активировано новое действие.

Последнее, что вы захотите изучить в соглашениях об именах. Классы должны очень сильно быть UpperCamelCase, они важны, убедитесь, что люди не путают их с переменными :)