2011-06-13 35 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,因爲當對話框被取消時,基礎活動可能已被破壞。在銷燬活動之前,活動的狀態將被保存。之後關閉對話將導致不一致的狀態。