2015-02-09 54 views
1

大多數開發人員不知道,即使活動已被finish() -ed,AsyncTasks啓動它直到完成。 一些開發人員知道,即使在onStop()中您撥打asyncTask.cancel(true),AsyncTask仍會運行直到完成,因爲所有.cancel(true)都會提出一個標誌,我們應該在每次操作前定期檢查並在doInBackground之前手動返回。 但是,如果我們正在進行長時間運行的操作,我們無法在操作持續時間內進行檢查,所以我們無效。如何使用蠻力取消AsyncTask

我讀過關於給給定的AsyncTask分配一個線程ID的提示,所以我們可以通過它的ID立即終止線程。

這可能嗎?它是如何完成的?

編輯:這是我做什麼,當我試圖阻止長時間運行的網絡操作:

​​

,然後我可以取消至少此操作。

回答

5

從來沒有通過它的id殺死一個線程,除非你完全終止整個應用程序的操作系統級別。您不知道該線程處於什麼狀態。它可能會有文件打開以進行寫入或其他資源,這會使應用程序處於不一致狀態,可能會永久存在。這就是爲什麼Java的Thread.stop()已被棄用的原因。正確的答案是取消異步任務,然後有時候檢查任務是否被取消,如果它返回true,在給它時間清理自己之後終止它自己。不足之處在於,讓任務運行完成更安全。

+0

如何從我們需要顯示到ImageView的互聯網上下載的圖像,但在用戶離開此畫面 - 這是資源的完全浪費。我真的希望能夠取消這個 – 2015-02-09 21:59:41

+0

我已經編輯了我的問題,以便我停止網絡操作 – 2015-02-09 22:02:03

+0

無關緊要 - 無法知道在某個點取消線程是否會導致全局性問題變量在HTTP堆棧中,或者持有一個會使其他線程死鎖的信號量。更不用說AsyncTasks共享線程,因此停止線程可能會破壞所有其他異步任務。現在有可能您的http堆棧可能具有取消功能。如果是這樣的話應該是安全的,讓你的任務覆蓋取消調用它(並記得打電話super.cancel()) – 2015-02-09 22:04:36

0

在您的onStop()方法中,您可以觸發全局布爾值爲true或false,並在doInBackground()中設置一個循環以在更改時取消。​​3210

protected Object doInBackground(Object... x) { 
    while (/* condition */) { 
     // work... 
     if (isCancelled()) break; 
    } 
    return null; 
} 
+0

這不是「使用蠻力」的方法,所以你沒有提供OP問題的答案。 – 2015-02-09 21:58:34