Как остановить нить 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;

}

Другие вопросы по тегам