2011-06-13 67 views
1

我正在使用ProgressDialog在我的后台进程继续时显示,但后台进程完成后,ProgressDialog仍然不会被解除。如何关闭AsyncTask中的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..."); 
    } 
} 
+1

请仅向我们展示您的代码的相关部分,试图解除对话框。 – 2011-06-13 06:58:42

+0

您是否检查过布尔结果是否成立?你根本不处理可能的例外,这是一件坏事。 – 2011-06-13 07:09:31

+0

你已经检查过布尔值是否成立。 – 2011-06-13 07:13:14

回答

3

您可以拨打AsyncTaskonPostExecute()方法拨打progressDialog.dismiss()

3

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

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

} 
+0

Egor和Alex的不同? – 2011-06-13 06:57:16

+0

@PMPareshMayani:是的,他们缺少代码示例。但他的回答没有解释。 – 2011-06-13 06:59:43

+0

雅是真的,因为我总是通过正确的用户名和密码,我也调试与sysout一起检查。 – 2011-06-13 07:23:02

0

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

但接下来的用户会有什么有同样的问题(我曾经有过,现在也是如此)..

的问题是在你的宣言。

final ProgressDialog progressDialog = new ProgressDialog(getParent()); 
因为在你把在那里的getParent参数(可能MainActivity.this) 和你做同样的呼吁显示方法的第一个

或在你的“第二”的宣言

。 因此,有2个父母..如果你在后期执行中调用dismiss()执行..解散第一个..但不是另一个然后dialog.isShowing()等于false。

那么重要的是那里只有1 !!!!!父母content..so你可以声明与分配的内容:

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,因为当对话框被取消时,基础活动可能已被破坏。在销毁活动之前,活动的状态将被保存。之后关闭对话将导致不一致的状态。