Android:等待UI在AsyncTask中完成

时间:2016-09-22 19:48:53

标签: android android-asynctask

在我的AsyncTask的doInBackground函数中,我调用它来显示一个确认对话框:

BroadcastAppearanceJob

在doInBackground()中调用上面的函数后,我开始一个新的活动。问题是,由于它是异步的,所以它不会等待上述功能完成。我只能看到弹出窗口然后关闭。怎么解决这个问题?

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

我正在调用此函数:

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

它仍然没有等我按OK,只是弹出并消失。

2 个答案:

答案 0 :(得分:1)

在异步任务中重载onPostExecute并在其中编写对话框和目标代码

答案 1 :(得分: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,它们很重要,确保人们不要让它们与变量混淆:)