我想停止另一個AsyncTask
線程的AsyncTask
線程。我嘗試過像 new AsyncTask.cancel(true)
來停止後臺進程,但並沒有停止。如何在android中停止asynctask線程?
任何人都可以幫助我嗎?
我想停止另一個AsyncTask
線程的AsyncTask
線程。我嘗試過像 new AsyncTask.cancel(true)
來停止後臺進程,但並沒有停止。如何在android中停止asynctask線程?
任何人都可以幫助我嗎?
聲明你的AsyncTask您的活動:
private YourAsyncTask mTask;
實例化它是這樣的:
mTask = new YourAsyncTask().execute();
殺/取消這樣的:
mTask.cancel(true);
事情沒有停止的原因是因爲進程(doInBackground())運行直到完成。因此,你應該檢查,如果線程被取消或沒有做的東西之前:
if(!isCancelled()){
// Do your stuff
}
所以基本上,如果線程沒有被取消,這樣做,否則跳過吧:) 可能是有用的檢查此有時在你的手術過程中,特別是在時間耗盡之前。
而且它可能是 「清理」 小有一點有用的
onCancelled();
的文檔的AsyncTask:
http://developer.android.com/reference/android/os/AsyncTask.html
希望這有助於!
如果你傳遞true作爲參數,那麼它將停止在後臺任務,所以這隻有在你將false傳入'task.cancel(布爾)' –
我有一個類似的問題 - 基本上我是在用戶銷燬碎片後在異步任務中獲得NPE。研究對堆棧溢出問題後,我採取了以下解決方案:
volatile boolean running;
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
running=true;
...
}
public void onDestroy() {
super.onDestroy();
running=false;
...
}
然後,我檢查「是否運行」定期在我的異步代碼。我有壓力測試了這一點,現在我無法「打破」我的活動。這完美地工作,並且比我在SO上看到的一些解決方案更簡單。
你不能立即殺死asynctask。爲了它阻止你應該首先將其取消:
task.cancel(true);
,比的AsyncTask的doInBackground()方法檢查它是否已經取消:
isCancelled()
,如果是,手動停止執行它。
ü可以檢查onCancelled()一次,然後:
保護對象doInBackground(對象...X){
while (/* condition */) {
if (isCancelled()) break;
}
return null;
}
時纔有用。這不是關於從另一個線程取消AsyncTask。 – QMaster
您也可以在或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
感謝對象您。
我到這裏就是爲了這個! – winklerrr
使用像這樣YourAsynchTask mTask = new YourAsncTask(); mTask.execute();工作。不錯。 – Senthil
雖然這很麻煩,但是如果你有一個單一的操作(比如數據庫查詢),你真的不能取消。如果查詢需要很長時間並且只是一個調用,那麼看起來沒有辦法取消它:/ – AgentKnopf
如果您在AsyncTask內部(在一個循環中)執行某些操作,那麼您可能需要檢查isCancelled() - 參考https://stackoverflow.com/questions/10882543/how-to-completly-kill-remove-delete-stop-an-asynctask-in-android – amar