Как остановить нить asynctask в Android?
Я хочу остановить AsyncTask
нить из другого AsyncTask
нить. Я пробовал какnew AsyncTask.cancel(true)
остановить фоновый процесс, но он не остановился.
Может ли кто-нибудь помочь мне в этом?
6 ответов
Объявите свой 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
Надеюсь это поможет!
Вы также можете использовать его в onPause
или же onDestroy
из Activity
Жизненный цикл:
//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
Спасибо.
Вы не можете просто убить асинктаск сразу. Чтобы остановить его, сначала отмените его:
task.cancel(true);
и затем в методе doInBackground() asynctask проверьте, не отменен ли он уже:
isCancelled()
и если это так, прекратите его выполнение вручную.
У меня была похожая проблема - по сути, я получал NPE в асинхронной задаче после того, как пользователь уничтожил фрагмент. После исследования проблемы переполнения стека я принял следующее решение:
volatile boolean running;
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
running=true;
...
}
public void onDestroy() {
super.onDestroy();
running=false;
...
}
Затем я периодически проверяю "работает" в своем асинхронном коде. Я прошел стресс-тестирование, и теперь я не могу "сломать" свою деятельность. Это прекрасно работает и имеет преимущество в том, что проще, чем некоторые решения, которые я видел в SO.
Вы можете проверить onCancelled() один раз:
защищенный объект doInBackground (Object... x) {
while (/* condition */) {
if (isCancelled()) break;
}
return null;
}