2012-08-02 63 views
1

我有兩個不起作用的AsyncTask。必須有一些共同點,我做錯了。無法停止AsyncTask中的ProgressDialog

我的第一個活動需要很長時間來加載,所以我希望有一個progressDialog/Bar,但它失敗。我訪問的AsyncTask在我的onCreate與

new HeavyWorker(this).execute(); 


public class HeavyWorker extends AsyncTask < String , Context , Void > { 

    private ProgressDialog  progressDialog ; 
    private Context    targetCtx ; 

    public HeavyWorker (Context context) { 
     this.targetCtx = context ; 
    //  this.needToShow = true; 
     progressDialog = new ProgressDialog (targetCtx) ; 
     progressDialog.setCancelable (false) ; 
     progressDialog.setMessage ("Retrieving data...") ; 
     progressDialog.setTitle ("Please wait") ; 
     progressDialog.setIndeterminate (true) ; 
    } 

    @ Override 
    protected void onPreExecute () { 
     progressDialog.show () ; 
    } 

    @ Override 
    protected Void doInBackground (String ... params) { 
     // Do Your WORK here 

低於做工精細這些線時,在正常
「公共無效的onCreate(捆綁savedInstanceState)」區域

 Ls = new LoadSettings(CreateAppointment.this); 
     gs = new GlobalSubs(); 

     TimeZoneList(); 

此行動態填充一個微調框並阻止它工作,所以我評論了它。

//  createTimezone(); 
     ZoneList(Ls.getCountryZone()); 

該行還填補了spinnerbox動態地使我評論它

// createZone(); 
     InitialiseUI(); 
     CreateFileName(); 

     return null ; 
    } 

該區域從未達到過?

@ Override 
    protected void onPostExecute (Void result) { 
     if(progressDialog != null && progressDialog.isShowing()){ 
      progressDialog.dismiss () ; 
     } 
    } 
} 

我的第二頁失敗,出現相同風格的問題。
我也嘗試在設置頁面中使用稍微不同的代碼。 與現在修正:

// 
private class MyClass extends AsyncTask<Void, Void, Void>{ 

ProgressDialog mProgressDialog; 

public MyClass(){ 

mProgressDialog = new ProgressDialog(Preferences.this); 
mProgressDialog.setMessage ("Please Wait While Saving"); 
mProgressDialog.setTitle("Saving"); 

//

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    mProgressDialog.show(Preferences.this, "Saving", "Please Wait a Sec"); 
} 

@Override 
protected Void doInBackground(Void... params) 
    { 
     saveSettings(); 
     return null; 
    } 

@Override 
protected void onPostExecute(Void unused) { 

它的工作的唯一辦法是,當我註釋掉該行並切換到不同的活動

// mProgressDialog.dismiss(); 
     Toast.makeText(Preferences.this, "Your Settings Where Saved.", Toast.LENGTH_SHORT).show(); 
    gotoMainPage(); 
} 

} 

    private void gotoMainPage(){ 
     Intent a = new Intent(this, Main_entry.class); 
     finish(); 
     startActivity(a); 
    } 
+1

你能否描述你的問題而不中斷髮布的代碼?你的ASyncTask如何實現幾乎是無法理解的。 – WarrenFaith 2012-08-02 01:17:34

回答

1

你是不是應該在背景中對UI做任何事情。 doInBackground()在後臺線程上運行。如果您需要在後臺進程中更新UI,則可以使用publishProgress()(和onProgressUpdate())。

它看起來對我來說,你仍然想在這裏執行的UI操作:

// createZone(); 
    InitialiseUI(); 
    CreateFileName(); 

我不知道是什麼InitialiseUI()做,但它聽起來UI十歲上下。如果您需要UI設置,請在UI線程中調用preExecute()

你可以在你的doInBackground()方法中設置一個斷點,看看它有多遠,讓我們知道?這將有所幫助。

在你的第二個例子,你說這是失敗在這裏onPostExecute()

mProgressDialog.dismiss(); 

這確實爲失敗只有一個辦法。如果mProgressDialog爲空。你可以檢查這個類的構造函數,並確保你記得實例化它嗎?

P.S.您的第一個AsyncTask子類中有第二個通用參數Context。但是,你似乎沒有使用它。通常,這將是doInBackground()通過publishProgress()傳遞給onProgressUpdate()的數據類型。

+0

我可以讓它「返回null」,然後它永遠不會到OnPostExecute。在第二個例子中,它得到OnPostExecute但鎖定在mProgressDialog.dissmis();這就是它被註釋掉的原因。 – John 2012-08-02 01:26:27

+0

... to * what *?另外,你在看LogCat窗口嗎?你看到有什麼例外嗎?你有'try-catch'塊的代碼,你在哪裏捕獲異常,但是什麼也不做(空'catch'處理程序)? – Nate 2012-08-02 01:29:14

+0

我將檢查InitialiseUI,因爲它會更新UI,但似乎沒有問題。 – John 2012-08-02 01:29:43