2013-04-13 88 views
0

我有一個EditText和一個AsyncTask類。每當EditText中的文本發生變化時,AsyncTask類的對象就會使用該字符串創建並調用execute()。並且doBackground()被調用,它只有一個函數,它依次具有多個for循環。 AsyncTask的新對象在文本更改時創建。 當文本更改時,舊的Async對象必須被取消,並且新的Async對象應該控制。但是當我調用對象的取消時,舊的繼續運行,似乎調用onPostExecute()。 有沒有辦法避免這種情況。我的意思是,我可以在運行新的asyncTask對象之前徹底殺死/(停止運行)舊的asyncTask對象嗎?Android:AsyncTask取消()問題

編輯 這是我的代碼,

if (getSuggestions1.getStatus() != AsyncTask.Status.RUNNING) { 
    getSuggestions1.cancel(true); 
    getSuggestions1 = new GetSuggestions1(); 
    getSuggestions1.execute(new String[] { str }); 
} 

正如你可以打電話取消同一個對象後立即看到我調用execute()。另外,正如我所說的,我有多個循環(6)。我很擔心這個函數isCancelled(),當對象立即初始化時,其中一個for循環返回true。

+0

參見[這](http://stackoverflow.com/a/10882600/1289716)的回答可以幫助你... – MAC

+1

「正如你所看到的,我調用execute()調用取消同一個對象後立即「。它們不是同一個對象。你用同樣的指針調用它,在'new'關鍵字之後它指向一個新的對象。 – Budius

+0

請參閱**在[此Android API文檔頁面]上取消任務**(http://developer.android.com/reference/android/os/AsyncTask.html) – Nate

回答

0

您可以在您的類中創建一個名爲shouldCancel的布爾標誌,用於擴展ASyncTask並在doInBackground()中定期檢查它是否已設置,然後從doInBackground方法返回。

+1

AsyncTask已經有[isCancelled()](http: //developer.android.com/reference/android/os/AsyncTask.html#isCancelled())就是爲了這個目的。不需要創建另一個標誌。 – Nate

1

嘗試使用類似

while (!isCancelled()) { 
    // processing 
} 

if (!isCancelled()) { 
    // processing 
} 

的,如果用一句話,如果你有很多循環,至少這是我所經歷的還是不錯的。當然這些應該在doInBackground()中使用。

2

除了已經給出的答案。

停止(取消)AsyncTask是合作行爲。這意味着只需撥打AsyncTask.cancel()是不夠的。這個調用只是設置一個取消的狀態(一個標誌),不做任何事情。您的AsyncTask實施應提供合作(幫助)以實際停止處理。具體而言,這意味着如果您希望AsyncTask的可取消性高度響應,您需要安排檢查取消狀態的頻率。因此,將if (isCancelled()) { return null; }語句放入循環中。