2011-10-19 49 views

回答

87

聲明你的AsyncTask您的活動:

private YourAsyncTask mTask; 

實例化它是這樣的:

mTask = new YourAsyncTask().execute(); 

殺/取消這樣的:

mTask.cancel(true); 
+2

使用像這樣YourAsynchTask mTask = new YourAsncTask(); mTask.execute();工作。不錯。 – Senthil

+3

雖然這很麻煩,但是如果你有一個單一的操作(比如數據庫查詢),你真的不能取消。如果查詢需要很長時間並且只是一個調用,那麼看起來沒有辦法取消它:/ – AgentKnopf

+0

如果您在AsyncTask內部(在一個循環中)執行某些操作,那麼您可能需要檢查isCancelled() - 參考https://stackoverflow.com/questions/10882543/how-to-completly-kill-remove-delete-stop-an-asynctask-in-android – amar

21

事情沒有停止的原因是因爲進程(doInBackground())運行直到完成。因此,你應該檢查,如果線程被取消或沒有做的東西之前:

if(!isCancelled()){ 
// Do your stuff 
} 

所以基本上,如果線程沒有被取消,這樣做,否則跳過吧:) 可能是有用的檢查此有時在你的手術過程中,特別是在時間耗盡之前。

而且它可能是 「清理」 小有一點有用的

onCancelled(); 

的文檔的AsyncTask:

http://developer.android.com/reference/android/os/AsyncTask.html

希望這有助於!

+0

如果你傳遞true作爲參數,那麼它將停止在後臺任務,所以這隻有在你將false傳入'task.cancel(布爾)' –

1

我有一個類似的問題 - 基本上我是在用戶銷燬碎片後在異步任務中獲得NPE。研究對堆棧溢出問題後,我採取了以下解決方案:

volatile boolean running; 

public void onActivityCreated (Bundle savedInstanceState) { 

    super.onActivityCreated(savedInstanceState); 

    running=true; 
    ... 
    } 


public void onDestroy() { 
    super.onDestroy(); 

    running=false; 
    ... 
} 

然後,我檢查「是否運行」定期在我的異步代碼。我有壓力測試了這一點,現在我無法「打破」我的活動。這完美地工作,並且比我在SO上看到的一些解決方案更簡單。

6

你不能立即殺死asynctask。爲了它阻止你應該首先將其取消:

task.cancel(true); 

,比的AsyncTask的doInBackground()方法檢查它是否已經取消:

isCancelled() 

,如果是,手動停止執行它。

-4

ü可以檢查onCancelled()一次,然後:

保護對象doInBackground(對象...X){

while (/* condition */) { 
    if (isCancelled()) break; 
} 
return null; 

}

+0

時纔有用。這不是關於從另一個線程取消AsyncTask。 – QMaster

9

您也可以在或Activity生命週期onDestroy使用它:

//you may call the cancel() method but if it is not handled in doInBackground() method 
if (loginTask != null && loginTask.getStatus() != AsyncTask.Status.FINISHED) 
    loginTask.cancel(true); 

其中loginTask是您AsyncTask

感謝對象您。

+0

我到這裏就是爲了這個! – winklerrr