Ссылаясь на ответ Янченко от 29 апреля 2010 г .: Использование подхода «пока (выполняется)» удобно, когда ваш код под «doInBackground» должен выполняться несколько раз во время каждого выполнения AsyncTask. Если ваш код в doInBackground должен выполняться только один раз за выполнение AsyncTask, перенос всего вашего кода в doInBackground в цикл while (running) не остановит выполнение фонового кода (фонового потока), когда Сам AsyncTask отменяется, потому что условие while (running) будет оценено только после того, как весь код внутри цикла while будет выполнен хотя бы один раз. Таким образом, вы должны либо (а.) Разбить свой код в разделе «doInBackground» на несколько блоков «пока (выполняется)» или (б.) Выполнить множество «isCancelled».https://developer.android.com/reference/android/os/AsyncTask.html .
Таким образом, для варианта (а) ответ Янченко можно изменить следующим образом:
public class MyTask extends AsyncTask<Void, Void, Void> {
private volatile boolean running = true;
//...
@Override
protected void onCancelled() {
running = false;
}
@Override
protected Void doInBackground(Void... params) {
// does the hard work
while (running) {
// part 1 of the hard work
}
while (running) {
// part 2 of the hard work
}
// ...
while (running) {
// part x of the hard work
}
return null;
}
// ...
Для варианта (b.) Ваш код в doInBackground будет выглядеть примерно так:
public class MyTask extends AsyncTask<Void, Void, Void> {
//...
@Override
protected Void doInBackground(Void... params) {
// part 1 of the hard work
// ...
if (isCancelled()) {return null;}
// part 2 of the hard work
// ...
if (isCancelled()) {return null;}
// ...
// part x of the hard work
// ...
if (isCancelled()) {return null;}
}
// ...