2012-07-28 52 views
2

正在運行的AsyncTask的.cancel(boolean)方法如何工作?以下是文檔:取消AsyncTask

嘗試取消執行此任務。如果任務已完成,已被取消或因其他原因無法取消,此嘗試將失敗。如果成功,並且此任務在調用取消時尚未開始,則此任務不應運行。如果任務已經開始,則mayInterruptIfRunning參數確定執行此任務的線程是否應該中斷以試圖停止任務。

調用此方法將導致在doInBackground(Object [])返回後,在UI線程上調用onCancelled(Object)。調用此方法可確保永不調用onPostExecute(Object)。調用此方法後,應該從doInBackground(Object [])中定期檢查isCancelled()返回的值,以儘早完成任務。

第二段意味着由程序員在取消調用後(通過定期檢查isCancelled())儘快從doInBackground方法返回。但在測試中,我的AsyncTask(doInBackground方法)似乎會立即停止,即使我不這樣做,但在調用cancel之後。有誰能解釋這個嗎? (當調用cancel時,Logcat不顯示任何事情,順便說一句)。

protected Void doInBackground(Void... V) { 
      for (int v=3;v>0;v--){ 
       publishProgress(v); 
       try {Thread.sleep(1500);} catch (InterruptedException e) {} 
      } 
      return null; 
     } 

而且,這種情況無論mayInrerruptIfRunning所提供的價值,因此,如果它能夠解釋該值所在進來,那也將非常讚賞。

+0

正確的方法取消和android中的asynctask http://www.quicktips.in/correct-way-to-cancel-an-asynctask-in-android/ – 2016-06-29 17:07:38

回答

2

有幾個核心方法(「阻塞方法」),如Thread.sleep(),它們自己檢查線程中斷並拋出異常。

+0

有趣。但是,即使我將mayInterruptIfRunning傳遞爲false,爲什麼會發生? – lukeuser 2012-07-28 22:30:05

+0

@lukeuser:我剛剛測試過,並取消(false)按預期工作('Thread.sleep'沒有中斷) – SteveR 2012-07-29 00:37:24

+0

對不起,我的任務沒有停止,我只是以爲是因爲我沒有知道當任務被取消時,onProgressUpdate方法不會被調用(非常愚蠢)。值得指出的是,如果調用cancel(true),Thread.sleep()僅在調用cancel時運行(因此如果有多個sleep(),則不會中斷下一個) – lukeuser 2012-07-30 16:39:28

0

您可以將檢查isRunning()放在AsyncTask的doInBackground中,如果是,則返回null。否則,只能在doInBackground運行後取消它。