Как остановить нить asynctask в Android? - PullRequest
53 голосов
/ 19 октября 2011

Я хочу остановить поток AsyncTask из другого потока AsyncTask.Я пытался как new AsyncTask.cancel(true) остановить фоновый процесс, но он не остановился.

Может ли кто-нибудь помочь мне в этом?

Ответы [ 6 ]

102 голосов
/ 19 октября 2011

объявите свой asyncTask в своей деятельности:

private YourAsyncTask mTask;

создать его так:

mTask = new YourAsyncTask().execute();

убить / отменить это так:

mTask.cancel(true);
20 голосов
/ 19 октября 2011

Причина, по которой вы не останавливаетесь, состоит в том, что процесс (doInBackground ()) работает до тех пор, пока не завершится.Поэтому вы должны проверить, отменен ли поток перед выполнением чего-либо:

if(!isCancelled()){
// Do your stuff
}

Так что, в принципе, если поток не отменен, сделайте это, в противном случае пропустите его :) Может быть полезно проверить этораз во время вашей работы, особенно перед тем, как брать вещи.

Также может быть полезно «очистить» alittle в

onCancelled();

Документация для AsyncTask:

http://developer.android.com/reference/android/os/AsyncTask.html

Надеюсь, это поможет!

12 голосов
/ 04 января 2016

Вам также может понадобиться использовать его в 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

Спасибо.

6 голосов
/ 15 мая 2014

Вы не можете просто сразу убить асинктаску. Чтобы остановить его, сначала отмените его:

task.cancel(true);

, а затем в методе doInBackground () в asynctask проверьте, отменен ли он уже:

isCancelled()

и, если это так, прекратите его выполнение вручную.

0 голосов
/ 27 декабря 2014

вы можете проверить onCancelled () один раз, затем:

защищенный объект doInBackground (Object ... x) {

while (/* condition */) {
  if (isCancelled()) break;
}
return null;

}

0 голосов
/ 26 мая 2013

У меня была похожая проблема - по сути я получал NPE в асинхронной задаче после того, как пользователь уничтожил фрагмент. После исследования проблемы переполнения стека я принял следующее решение:

volatile boolean running;

public void onActivityCreated (Bundle savedInstanceState) {

    super.onActivityCreated(savedInstanceState);

    running=true;
    ...
    }


public void onDestroy() {
    super.onDestroy();

    running=false;
    ...
}

Затем я периодически проверяю "работает" в моем асинхронном коде. Я прошел стресс-тестирование, и теперь я не могу «сломать» свою деятельность. Это прекрасно работает и имеет то преимущество, что оно проще, чем некоторые решения, которые я видел в SO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...