Чтобы отменить отмену AsyncTask не должен периодически проверять флаг в doInBackground, будет неустойчивым?

Я хочу принудительно отменить AsyncTask. Я вижу, что вы можете использовать isCancelled() как в этом действительном решении (который под капотом используется AtomicBoolean.

Но я вижу такие решения, как suspiciousSolution1, suspiciousSolution2, suspiciousSolution3, где введен новый флаг private boolean isTaskCancelled = false;.

И я начал задаваться вопросом - поскольку этот флаг изменен в

public void cancelTask(){
   isTaskCancelled = true;
}

который выполняется на некотором потоке и читается в

protected Void doInBackground( Void... ignoredParams ) {
    //Do some stuff
    if (isTaskCancelled()){
        return;
    }
}

который работает в WorkerThread, тогда флаг флага isTaskCancelled не должен быть volatile (или AtomicBoolean, как в реализации Google).

Ответ 1

Да, это должно быть volatile. В противном случае запись в переменную в потоке A может быть не видна для чтения в потоке B из-за оптимизации (компилятором, JVM и т.д.). См. this

Ответ 2

Попробуйте

Initialize

  private AysncTask aysncTask;

Вызов задачи

   aysncTask=new AysncTask();
        aysncTask.execute();

Задание Отменить, где вы ХОТИТЕ

  if ( aysncTask != null && aysncTask.getStatus() == aysncTask.Status.RUNNING ){
        aysncTask.cancel(true);

    }

Ответ 3

Да, изменчивый. Учитывая, что вы используете это только для периодической проверки своей асинтезы. Если бы это были несколько потоков, я бы предложил использовать атомные поля. Pls см. Дополнительную информацию здесь: volatile vs atomic и Volatile boolean vs AtomicBoolean