2012-12-07 122 views
1

即使在onPostExecute()中運行progressDialog.dismiss,AsyncTask中的進度對話框也不會消失。在異步任務中沒有關閉進度對話框

我已經嘗試過對SO的相關問題實施很多答案,迄今爲止沒有成功。

我相信我必須忽略一些非常基本的東西,但我被卡住了。

任何指向解釋和代碼片段的指針都會很棒,謝謝。

主要

public class Main extends Activity { 
    String result; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     asyncTask task = new asyncTask("Loading ...", this); 
     try { 
      result = task.execute("Question").get(); 
     } 
     catch (Exception e) { 
      Log.e("Error: ", e.toString()); 
     } 
    } 
} 

的AsyncTask

public class asyncTask extends AsyncTask<String, Void, String> { 

    private ProgressDialog progressDialog; 
    private String message; 
    private Context context; 

    public asyncTask(String msg, Context ctx) { 
     this.context = ctx; 
     message = msg; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     progressDialog = new ProgressDialog(context); 
     progressDialog.show(context, "", message, true, false); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     int count = 100000; 
     for (int i = 0; i < count; i++) { 
      // waste time 
     } 
     return "Answer"; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     progressDialog.dismiss(); 
    } 
} 
+0

可能有一些例外,如果這是然後發佈您的logcat輸出的情況。 –

+0

@PareshMayani,沒有例外拋出,logcat是乾淨的 – Mike

回答

9

其實你正在做的:

progressDialog.show(context, "", message, true, false); 

相反,它應該是這樣的:

progressDialog = ProgressDialog.show(context, "", message, true, false); 

你要靜態地調用表演方法,並將其分配給您的progressDialog

+0

看起來像這樣可以是問題... –

+0

請投票或標記是否有幫助:) – ZealDeveloper

+0

已經完成:) –

-3
progressDialog.dismiss(); 

一個return語句之前()方法把這個doInBackground。

+0

剛剛嘗試過,相同的結果,繼續運行。 – Mike

+0

也許我已經從UI線程中殺了它,但我不知道該怎麼做? – Mike

+0

從您的code.its中移除.get()爲我工作。 –

2

製作這改變了你的onPostExecute

@Override 
protected void onPostExecute(String result) { 
    try{ 
      if(progrssDialog.isShowing()){ 
        progressDialog.dismiss(); 
      } 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
    finally 
    { 
     progressDialog.dismiss(); 
    } 

} 
1

致電.get()你強迫main thread等待更換

task.execute("Question").get(); 

task.execute("Question"); 

。它會/可以掛你的用戶界面。

+0

雖然這是一個很好的*評論*,它不是*這個問題的答案。 – nhaarman

+0

@尼克它實際上是問題所在。通過調用'.get()''onPostExecute'永遠不會被調用! –

+0

@MMohsinNaeem這是正確的答案。但你可以編輯你的代碼爲'//在這裏顯示進度條task.execute(「問題」)。 //解僱這裏'而不是onPostExecute –

2

一個常見的問題,我找到的是變量範圍。 大多數情況下,ProgressDialog都會在Method中定義,不會在該方法之外訪問。

你需要這樣聲明,

Public Class MainActivity extends Activity { 

ProgressDialog progressDialog; 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
} 

private class asyncTask extends AsyncTask<String, Void, String> { 

@Override 
protected void onPostExecute(String result) { 
    super.onPostExecute(result); 
    progressDialog.dismiss(); 
} 
} 
+0

這只是對代碼的部分概述..讓我知道你是否需要完整的源代碼 –