如何在AsyncTask中解除ProgressDialog

问题描述 投票:1回答:5

我正在使用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...");
    }
}
android
5个回答
3
投票

你可以在你的progressDialog.dismiss()AsyncTask方法中调用onPostExecute()


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

}

3
投票

onPostExecute()方法中,在对话框中调用dismiss()


0
投票

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

但对于下一个用户会有同样的问题(我现在也有)..

问题出在你的声明中。

final ProgressDialog progressDialog = new ProgressDialog(getParent());

或者在你的“第二次”声明中

progressDialog.show(getParent(), "Working..", "Please wait...");

因为在第一个中你放入了getParent参数(可能是MainActivity.this)和你在调用show方法时所做的相同。因此有2个父母..如果你在post执行中调用dismiss(),则忽略第一个..但不是另一个什么然后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();

但从来没有给过两次父母,内容,等等......


0
投票

AsyncTasks不应该处理所有对话框。在PostExecute阶段解除对话框很容易导致IllegalStateException,因为当对话框被解除时,底层活动已经被销毁。在销毁活动之前,将保存活动的状态。之后解除对话将导致状态不一致。

© www.soinside.com 2019 - 2024. All rights reserved.