Android AlertDialog未在AsyncTask中显示

Android AlertDialog未在AsyncTask中显示,android,android-asynctask,Android,Android Asynctask,我有一个带有按钮的活动,它启动一个异步任务: public void search(View view) { if (searchTask != null) { return; } searchTask = new SearchTask(this); searchTask.execute((Void)null); } 这就是任务: public class SearchTask extends AsyncTask<Void, Void,

我有一个带有按钮的活动,它启动一个
异步任务

public void search(View view) {
    if (searchTask != null) {
        return;
    }

    searchTask = new SearchTask(this);
    searchTask.execute((Void)null);
}
这就是任务:

public class SearchTask extends AsyncTask<Void, Void, Boolean> {
    private final Activity activity;
    private final ProgressDialog dialog;

    public SearchTask(Activity activity) {
        this.activity = activity;
        this.dialog = new ProgressDialog(activity);
    }

    @Override
    protected Boolean doInBackground(Void... params) {
        try {
            wait(3000);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

        return true;
    }

    @Override
    protected void onPreExecute() {
        dialog.show();
    }

    @Override
    protected void onPostExecute(final Boolean success) {
        if (dialog.isShowing())
            dialog.dismiss();
    }
}
公共类SearchTask扩展了AsyncTask{
私人最终活动;
私人对话;
公共搜索任务(活动){
这个。活动=活动;
this.dialog=新建进度对话框(活动);
}
@凌驾
受保护的布尔doInBackground(Void…params){
试一试{
等待(3000);
}捕获(例外e){
e、 printStackTrace();
返回false;
}
返回true;
}
@凌驾
受保护的void onPreExecute(){
dialog.show();
}
@凌驾
受保护的void onPostExecute(最终布尔值成功){
if(dialog.isShowing())
dialog.dismise();
}
}
我没有调用
get()
,所以我不应该阻塞UI线程。问题是没有显示“进度”对话框


这不是在
AsynTask
中显示对话框的正确方法吗?

wait()
导致
illegelmonitoreException
。要在任务
线程中应用延迟,应使用sleep()

删除返回后重试从下面的代码-

public void search(View view) {
    if (searchTask != null) {
        return;
    }

    searchTask = new SearchTask(this);
    searchTask.execute((Void)null);
}

您确定正在调用wait并且没有异常吗?请检查您的LogCat是否有错误,但除此之外,您不应该像您那样传递活动(您正在将它提供给AsyncTask)。相反,构建ProgressDialog对象并将其传递给AsyncTask。更好的方法是使用DialogFragment。检查搜索方法是否真的是调用的,并且您的searchTask将只执行一次,因为您调用dialog.show()“if(searchTask!=null){return;}”;在onPreExecute中,您自己的答案是wrong@Divers这没有错。它没有显示是因为任务执行得太快,因为出现异常,对话框没有时间显示,而您的问题是错误的,因为ProgressDialogappears@Divers. 没有。他发现了异常,马上就回来了。@潜水员如果出现对话,他为什么要问这个问题?就像我说的,对话框没有足够的时间显示,因为任务执行得太快,以至于在显示之前调用了disclose