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