Para forzar la cancelación AsyncTask no debería el indicador periódicamente marcado en doInBackground ser volátil?

Quiero forzar cancelar AsyncTask. Veo que se puede utilizar isCancelled () como en esta solución válida (que bajo la campana utiliza AtomicBoolean .

Pero veo soluciones como suspiciousSolution1 , suspiciousSolution2 , suspiciousSolution3 donde hay una nueva bandera introducida private boolean isTaskCancelled = false; .

Y empecé a preguntarme – ya que esa bandera se modifica en

 public void cancelTask(){ isTaskCancelled = true; } 

Que se ejecuta en ALGUNA conversación, y se lee en

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

Que se ejecuta en WorkerThread , entonces no debe el flag isTaskCancelled ser volátil (o AtomicBoolean como en la implementación de Google).

Sí, debe ser volatile . De lo contrario, una escritura a la variable en el subproceso A puede no ser visible para una lectura en el subproceso B debido a la optimización (por compilador, JVM, etc.). Vea esto

Prueba esto

Inicializar

  private AysncTask aysncTask; 

Llamada de tarea

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

Cancelar tarea donde quieras

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

Sí, volátil. Teniendo en cuenta que sólo está utilizando esto para revisar periódicamente su asynctask. Si fueran múltiples hilos, sugeriría usar campos atómicos. Pls vea más información aquí: volátil contra atómico y volátil boolean contra AtomicBoolean

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.