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;
.
- Bloques sincronizados android
- ¿Por qué parece que tomar mucho tiempo para que este bloque sincronizado obtenga un bloqueo?
- ¿Puedo bloquear una tabla SQLite para el subproceso actual?
- Corrección multihilo: Utilización de bloqueo sincronizado
- RecyclerView IndexOutOfBoundsException
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).
- ¿La clase android.os.Handler elimina la necesidad de declarar ciertos métodos como sincronizados?
- Comercio con método de declaración sincronizado en java?
- ¿Cómo se rompió este código sincronizado?
- Android startService () tarda mucho tiempo en volver al subproceso de interfaz de usuario
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