一個很重要的事情,以前使用AsynTask從來沒有主動調用過取消,現在遇到了一個問題,就想著如何取消呢?
下面都是網上看到的一些理解,不過最好還是自己親自實驗後再決定如何做。
最後我決定在Fragment的onDesdroy() 方法中,這樣處理:
@Override public void onDestroy() { super.onDestroy(); if (mGetFileLength != null && !mGetFileLength.isCancelled()) { mGetFileLength.cancel(true); } }
----------------------------------------------------------------------------------------------------
AsyncTask無法用Cancel函數關掉.
如果AsyncTask正執行Sleep時,調用cancel方法,會產生異常InterruptedException.
如果希望能中途關掉AsyncTask,最好設定一個標誌位,然後在doinbackground()裡去查詢這個標誌.
一個AsyncTask對象只能執行一次,想執行第二次,必需重新建立.
-------------------------------------------------------------------------------------------------------
在java的線程中,沒有辦法停止一個正在運行中的線程。在Android的AsyncTask中也是一樣的。如果必須要停止一個線程,可以採用這個線程中設定一個標誌位,然後線上程run方法或AsyncTask的doInBackground方法中的關鍵步驟判斷這個標誌位以決定是否繼續執行。然後在需要終止此線程的地方改變這個標誌位以達到停止線程的目的。
從外部調用AsyncTask的cancel方法並不能停止一個已經啟動的AsyncTask。這個cancel方法的作用與線程的interrupt方法相似,調用了一個線程的interrupt方法之後線程仍然運行,但是如果該線程的run方法裡面調用過sleep的或者wait方法後,處於sleep或wait狀態,則sleep和wait立即結束並且拋出InterruptedException異常。AsyncTask的cancel方法也一樣,如果在這個Task的doInBackground方法中調用了sleep或wait方法,當在UI線程中調用了這個Task執行個體的cancel方法之後,sleep或wait立即結束並且拋出InterruptedException異常,但是如果捕獲該異常的代碼後面還有其他代碼,則這些代碼還會繼續執行。
------------------------------------------------------------------------------------------------------------
http://hi.baidu.com/justtmiss/item/e67ebf5a964ed4cad2e10cf0
http://www.cnblogs.com/tt-0411/archive/2012/03/25/2410830.html
http://blog.csdn.net/cynhafa/article/details/6860201