2016-09-22 58 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,它们是重要的,要让人们没有得到他们混淆变量:)