Android 如何在AsyncTask中取消ProgressDialog

Android 如何在AsyncTask中取消ProgressDialog,android,Android,我正在使用一个ProgressDialog在后台进程继续时显示,但后台进程完成后,ProgressDialog仍不会被取消 这是我的密码 private class async extends AsyncTask<String, Void, Boolean> { final ProgressDialog progressDialog = new ProgressDialog(getParent()); @Override protected Boolean

我正在使用一个
ProgressDialog
在后台进程继续时显示,但后台进程完成后,ProgressDialog仍不会被取消

这是我的密码

private class async extends AsyncTask<String, Void, Boolean> {
    final ProgressDialog progressDialog = new ProgressDialog(getParent());

    @Override
    protected Boolean doInBackground(String... params) {

        GetJson json = new GetJson();
        boolean success = false;

        JSONObject mJsonObject = json
            .readJsonObject("url");
        try {
            success = mJsonObject.getBoolean("success");
        } catch (Exception e) {
        }
        return success;
    }

    @Override
    protected void onPostExecute(Boolean result) {

        if (result) {
            if (progressDialog.isShowing())
                progressDialog.dismiss();
            }
        }
    }

    @SuppressWarnings("static-access")
    @Override
    protected void onPreExecute() {
        progressDialog.show(getParent(), "Working..", "Please wait...");
    }
}
私有类异步扩展异步任务{
final ProgressDialog ProgressDialog=新建ProgressDialog(getParent());
@凌驾
受保护的布尔doInBackground(字符串…参数){
GetJson=new GetJson();
布尔成功=假;
JSONObject mJsonObject=json
.readJsonObject(“url”);
试一试{
success=mJsonObject.getBoolean(“success”);
}捕获(例外e){
}
回归成功;
}
@凌驾
受保护的void onPostExecute(布尔结果){
如果(结果){
if(progressDialog.isShowing())
progressDialog.disclose();
}
}
}
@抑制警告(“静态访问”)
@凌驾
受保护的void onPreExecute(){
progressDialog.show(getParent(),“正在工作…”,“请稍候…”);
}
}

在对话框上的
onPostExecute()
方法调用
disease()

在对话框上的
onPostExecute()
方法调用
disease()

您可以在
异步任务
onPostExecute()
方法中调用
progressDialog.disease()

您可以在
AsyncTask
onPostExecute()
方法中调用
progressDialog.disease()

YourTask扩展AsyncTask的私有最终类{
private final class YourTask extends AsyncTask<Void, Void, Object> {
    private ProgressDialog dialog;

    @Override
    protected void onPreExecute() {
        dialog = ProgressDialog.show(YourActivity.this, "Title", "Message", true);
    }

    @Override
    protected Object doInBackground(final Void... params) {
        // Doing something
    }

    @Override
    protected void onPostExecute(final Object result) {
        // Check result or something
        dialog.dismiss();
    }

}
私人对话; @凌驾 受保护的void onPreExecute(){ dialog=ProgressDialog.show(YourActivity.this,“Title”,“Message”,true); } @凌驾 受保护对象doInBackground(最终无效…参数){ //做某事 } @凌驾 受保护的void onPostExecute(最终对象结果){ //检查结果什么的 dialog.dismise(); } }
您的任务扩展了AsyncTask的私有最终类{
私人对话;
@凌驾
受保护的void onPreExecute(){
dialog=ProgressDialog.show(YourActivity.this,“Title”,“Message”,true);
}
@凌驾
受保护对象doInBackground(最终无效…参数){
//做某事
}
@凌驾
受保护的void onPostExecute(最终对象结果){
//检查结果什么的
dialog.dismise();
}
}

我不知道,如果你解决了这个问题,可能是的

但是对于下一个用户,什么会有同样的问题(我现在也有这个问题)

问题在于你的申报

final ProgressDialog progressDialog = new ProgressDialog(getParent());
或者在你的“第二次”声明中

progressDialog.show(getParent(), "Working..", "Please wait...");
因为在第一个参数中放入了getParent参数(可能是MainActivity.this) 和调用show方法时所做的相同。 因此有两个父母。。如果在post execute中调用DISCLESH(),它将忽略第一个,而不是另一个,那么dialog.isShowing()等于false

所以重要的是只有1个!!!!!父内容..因此您可以在声明中使用以下内容分配内容:

new ProgressDialog(content);
或者你可以

ProgressDialog dialog=new ProgressDialog();
dialog.setMessage("Loading");
dialog.show(getParent());
然后把它扔了,一切都好了。 或者你可以:

ProgressDialog dialog=new ProgressDialog(getParent());
dialog.setMessage("Loading");
dialog.show();

但是千万不要在那里屈服两次父母、内容,不管怎样。

我不知道,如果你解决了这个问题,可能是的

但是对于下一个用户,什么会有同样的问题(我现在也有这个问题)

问题在于你的申报

final ProgressDialog progressDialog = new ProgressDialog(getParent());
或者在你的“第二次”声明中

progressDialog.show(getParent(), "Working..", "Please wait...");
因为在第一个参数中放入了getParent参数(可能是MainActivity.this) 和调用show方法时所做的相同。 因此有两个父母。。如果在post execute中调用DISCLESH(),它将忽略第一个,而不是另一个,那么dialog.isShowing()等于false

所以重要的是只有1个!!!!!父内容..因此您可以在声明中使用以下内容分配内容:

new ProgressDialog(content);
或者你可以

ProgressDialog dialog=new ProgressDialog();
dialog.setMessage("Loading");
dialog.show(getParent());
然后把它扔了,一切都好了。 或者你可以:

ProgressDialog dialog=new ProgressDialog(getParent());
dialog.setMessage("Loading");
dialog.show();

但是千万不要屈服于父母、内容等任何东西。

异步任务不应该处理任何对话框。在执行后阶段取消对话框很容易导致IllegalStateException,因为在取消对话框时,底层活动可能已经被销毁。销毁活动之前,将保存活动的状态。随后取消对话框将导致状态不一致

异步任务不应处理任何对话框。在执行后阶段取消对话框很容易导致IllegalStateException,因为在取消对话框时,底层活动可能已经被销毁。销毁活动之前,将保存活动的状态。随后取消对话框将导致状态不一致

伊戈尔和亚历克斯不同吗?@PMPareshMayani:是的,他们缺少代码示例。但是他的答案缺少一个解释。是的,因为我总是传递正确的用户名和密码,而且我还调试了sysout。Egor和Alex的不同吗?@PMPareshMayani:是的,他们缺少代码示例。但是,他的答案缺少解释。这是真的,因为我总是传递正确的用户名和密码,而且我还调试了sysout。请仅向我们显示您试图取消对话框的代码的相关部分。您是否检查过布尔值
结果是否变为真?你根本不处理一个可能的异常,这是一件坏事。我已经检查了布尔值是否为真。因此在
onPostExecute()
中,参数
result
肯定为
true
?检查progressDialog.isShowing()正在返回?请仅向我们显示您试图关闭对话框的代码的相关部分。您是否检查过布尔值
结果是否为真?你不能对付一个可能的人