Подтвердить что ты не робот

Как остановить поток asynctask в android?

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

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

4b9b3361

Ответ 1

объявите свою асинхронную операцию в вашей деятельности:

private YourAsyncTask mTask;

создайте его следующим образом:

mTask = new YourAsyncTask().execute();

убить/отменить его следующим образом:

mTask.cancel(true);

Ответ 2

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

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

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

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

onCancelled();

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

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

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

Ответ 3

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

Спасибо.

Ответ 4

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

task.cancel(true);

а не в методе asynctask doInBackground(), если он уже отменен:

isCancelled()

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

Ответ 5

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

volatile boolean running;

public void onActivityCreated (Bundle savedInstanceState) {

    super.onActivityCreated(savedInstanceState);

    running=true;
    ...
    }


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

    running=false;
    ...
}

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

Ответ 6

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

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

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

}