Я хочу остановить поток AsyncTask
из другого потока AsyncTask
. Я пробовал как
new AsyncTask.cancel(true)
, чтобы остановить фоновый процесс, но он не остановился.
Может ли кто-нибудь помочь мне в этом?
Я хочу остановить поток AsyncTask
из другого потока AsyncTask
. Я пробовал как
new AsyncTask.cancel(true)
, чтобы остановить фоновый процесс, но он не остановился.
Может ли кто-нибудь помочь мне в этом?
объявите свою асинхронную операцию в вашей деятельности:
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);
а не в методе asynctask doInBackground(), если он уже отменен:
isCancelled()
и если это так, прекратите выполнение его вручную.
У меня была аналогичная проблема - по сути, я получал 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.
u может проверить onCancelled() один раз, затем:
защищенный объект doInBackground (объект... x) {
while (/* condition */) {
if (isCancelled()) break;
}
return null;
}