Android ProgressDialog不';t使用Asynctask的多个实例排除

Android ProgressDialog不';t使用Asynctask的多个实例排除,android,android-asynctask,progressdialog,Android,Android Asynctask,Progressdialog,我在这个应用程序中有一个Asynctask,在onPreExecute中有一个ProgressDialog ProgressDialog pDialog; protected void onPreExecute() { pDialog = new ProgressDialog(Synchronization.this); pDialog.setMessage(Html.fromHtml("<b>Please Wait</b&g

我在这个应用程序中有一个Asynctask,在onPreExecute中有一个ProgressDialog

    ProgressDialog pDialog;

    protected void onPreExecute() {

        pDialog = new ProgressDialog(Synchronization.this);
        pDialog.setMessage(Html.fromHtml("<b>Please Wait</b><br/>Working..."));
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();

    }
但在这里,我看到一个创建的进度对话框在onPostExecute之后关闭(我也可以看到我的视图在后台更新),但紧接着,另一个进度对话框弹出,不会关闭。
不确定是什么原因造成的。有人能帮忙吗?

问题是,当您取消AsyncTask时,不会调用onPostExecute,而是调用onCanceled()。请参阅异步任务源

private void finish(Result result) {
        if (isCancelled()) {
            onCancelled(result);
        } else {
            onPostExecute(result);
        }
        mStatus = Status.FINISHED;
    }
因此,您的进度对话框不会关闭,因为从未调用onPostExecute。将此项添加到异步任务中可以解决此问题:

        @Override
        protected void onCancelled()
        {
             // dismiss the dialog on canceled task
             if(pDialog!=null && pDialog.isShowing())
                pDialog.dismiss();
        }

我不确定这是否导致您的问题,但请从
onPostExecute()
中删除
runOnUiThread
。这是不必要的,因为
onPostExecute()
UI线程上运行,它可能会导致问题/混乱您在哪里定义
ProgressDialog
?可能是这两个
AsyncTask
s相互干扰,而第二个会覆盖第一个
pDialog
引用吗?codemagic-我刚刚从代码中删除了runOnUiThread,但仍然是相同的行为。SimonSays-我尝试将其定义为实例变量以及AsyncTask的本地变量。不幸的是,这没什么区别。
private void finish(Result result) {
        if (isCancelled()) {
            onCancelled(result);
        } else {
            onPostExecute(result);
        }
        mStatus = Status.FINISHED;
    }
        @Override
        protected void onCancelled()
        {
             // dismiss the dialog on canceled task
             if(pDialog!=null && pDialog.isShowing())
                pDialog.dismiss();
        }