android multithreading android-asynctask synchronized volatile

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



multithreading android-asynctask (3)

Sí, debería ser volatile . De lo contrario, una escritura en 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.). Mira esto

Quiero forzar la cancelación de AsyncTask. Veo que puede usar isCancelled () como en esta solución válida (que bajo el capó usa AtomicBoolean .

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

Y comencé a preguntarme, ya que esa bandera se modifica en

public void cancelTask(){ isTaskCancelled = true; }

que se ejecuta en ALGÚN hilo, y se lee en

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

que se ejecuta en WorkerThread , entonces no debería el indicador isTaskCancelled ser volátil (o AtomicBoolean como en la implementación de Google).


Prueba esto

Inicializar

private AysncTask aysncTask;

Llamada de tarea

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

Tarea Cancelar donde quieras

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


Sí, volátil. Teniendo en cuenta que solo está usando esto para verificar periódicamente su asynctask. Si se tratara de varios hilos, sugeriría utilizar campos atómicos. Pls vea más información aquí: volátil vs atómico y booleano volátil contra AtomicBoolean