Ответ 1
Да, это должно быть volatile
. В противном случае запись в переменную в потоке A может быть не видна для чтения в потоке B из-за оптимизации (компилятором, JVM и т.д.). См. this
Я хочу принудительно отменить 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).
Да, это должно быть volatile
. В противном случае запись в переменную в потоке A может быть не видна для чтения в потоке B из-за оптимизации (компилятором, JVM и т.д.). См. this
Попробуйте
Initialize
private AysncTask aysncTask;
Вызов задачи
aysncTask=new AysncTask();
aysncTask.execute();
Задание Отменить, где вы ХОТИТЕ
if ( aysncTask != null && aysncTask.getStatus() == aysncTask.Status.RUNNING ){
aysncTask.cancel(true);
}
Да, изменчивый. Учитывая, что вы используете это только для периодической проверки своей асинтезы. Если бы это были несколько потоков, я бы предложил использовать атомные поля. Pls см. Дополнительную информацию здесь: volatile vs atomic и Volatile boolean vs AtomicBoolean