0

我想在後臺執行一些任務AsynTask。如下圖所示:取消與後退按鈕的asynctask

class CheckTypesTask extends AsyncTask<Void, Void, Void> { 

     ProgressDialog Asycdialog = new ProgressDialog(Home.this); 
     String typeStatus; 

     @Override 
     protected void onPreExecute() { 

      super.onPreExecute(); 

      Asycdialog.setMessage("First time initialization. Please wait..."); 
      Asycdialog.show(); 
     } 

     @Override 
     protected Void doInBackground(Void... arg0) { 

      create_database_and_tables(); 
      insert_in_questions(); 
      insert_in_answer_option(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      // hide the dialog 

      super.onPostExecute(result); 

      database.close(); 
      Asycdialog.dismiss(); 
     } 

現在的問題是,如果我按硬盤返回鍵,而ProgressDialog是可見的,它只是簡單地關閉ProgressDialog。但是,當我檢查Database時,我發現所有要插入的記錄都已成功插入。我不明白爲什麼ProgressDialog繼續顯示,即使doInBackground()完成其工作,無論ProgressDialog在某個時間後消失,但爲什麼這樣?

我的下一個問題是,如果要插入的數據集不夠大,那麼爲什麼仍然出現ProgressDialog。其實,我是這樣測試的。兩秒鐘後立即按下硬鎖鍵。並檢查數據庫,我發現所有的記錄都被插入。爲什麼只要doInBackground()完成其工作就不會被呼叫?

最後一個問題是,我想顯示一個AlertDialog與是和不Button,當硬按鍵被按下,而ProgressDialog仍然可見。然後,如果按下,則應該消失ProgressDialog,並且應該停止doInBackground()工作。如果沒有被按下,那麼只有AlertDialog應該被解僱,並且ProgressDialog應該仍然可見。

請幫我解決我的疑惑。

+0

看看我的這個答案是否有幫助:http://stackoverflow.com/a/15947770/450534 – 2013-04-24 08:21:33

回答

0

如果您在doInBackground中放置一行代碼只執行一次而不是循環,則在執行任務後無法取消它。但是如果您有循環或其他定期運行的命令,您可以使用setCancel(true)作爲您的任務,並在循環中執行語句之前檢查任務的值isCanceled()

我想,當您關閉對話框時,需要一些時間來檢查數據庫記錄,並在此期間doInBackground繼續,直到所有記錄插入DB.So當您檢查您的數據庫時,請參閱插入所有記錄。

而且onPostExecute()在UI線程立即被調用doInBackground(Object []對象)返回後(如果任務沒有被取消)。例如執行此的AsyncTask:

class Test extends AsyncTask<Void, Void, Void>{ 

     @Override 
     protected Void doInBackground(Void... params) { 
      System.out.println("End doInBackground"); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      System.out.println("Start onPostExecute"); 
     } 

    } 

但是你解僱對話框之前增加了一些命令這可能會消耗很少的時間,並且活動轉換(消除對話框和前景活動)本身會消耗一些時間。

編輯:

最後一個問題是,我想說明的AlertDialog用yes和 沒有按鍵,...

你有一個方法添加到您的AsyncTask類,它顯示具有所需功能的警報對話框,並存儲對任務的引用,並覆蓋Activity的方法。執行onBackPressed()時,調用Task實例的方法。雖然知道不能取消inserting progress如果你想要沒有記錄插入數據庫,你可以在後臺刪除它們,插入後!

+0

好吧,我找到了你。我正在做沒有任何循環的後臺工作。但你能解釋第一段和第二段嗎,我有疑問。 – 2013-04-24 08:26:11

+0

好的。我明白了。以及在硬按鍵上顯示AlertDialog的情況如何... – 2013-04-24 09:53:55

+0

@ shree202請再次查看我的答案。 – hasanghaforian 2013-04-24 10:10:08