En mi Actividad, uso una clase que se extiende desde AsyncTask y un parámetro que es una instancia de ese AsyncTask. Cuando llamo mInstanceOfAT.execute("")
todo está bien. Pero la aplicación se bloquea cuando presiono un botón de actualización que vuelve a llamar a AsyncTask (en caso de que el trabajo de red no funcione). Porque luego aparece una excepción que dice
No se puede ejecutar la tarea: la tarea ya se ha ejecutado (una tarea se puede ejecutar solo una vez)
He intentado llamar a cancel (true) para la instancia de Asyctask, pero tampoco funciona. La única solución hasta ahora es crear nuevas instancias de Asyntask. ¿Es esa la forma correcta?
Gracias.
fuente
Las razones de las instancias de disparo y olvido de ASyncTask se detallan bastante bien en la respuesta de Steve Prentice. Sin embargo, aunque tiene restricciones sobre cuántas veces ejecuta ASyncTask, puede hacer lo que quiera mientras el hilo se está ejecutando. .
Coloque su código ejecutable dentro de un bucle dentro de doInBackground () y use un bloqueo concurrente para activar cada ejecución. Puede recuperar los resultados con PubliveProgress () / onProgressUpdate () .
Ejemplo:
Por supuesto, esto es un poco más complicado que el uso tradicional de ASyncTask, y abandonas el uso de PubliveProgress () para los informes de progreso reales. Pero si le preocupa la memoria, este enfoque garantizará que solo quede un ASyncTask en el montón en tiempo de ejecución.
fuente
IllegalMonitorStateException
enrunAgain
(llamado poronProgressUpdate
) ver esta respuesta: stackoverflow.com/a/42646476/2711811 . Sugiere (y funcionó para mí) que lassignal()
necesidades deben estar rodeadas por unlock
/unlock
. Esto puede tener que ver con el momento de lapublishProgress
llamadaonProgressUpdate
.Tuve el mismo problema. En mi caso, tengo una tarea que quiero hacer dentro
onCreate()
y fueraonResume(
). Así que hice mi Asynctask estática y obtuve la instancia de ella. Ahora todavía tenemos el mismo problema.Entonces, lo que hice en onPostExecute () es esto:
Teniendo en cuenta que compruebo en el método getInstance estático que mi instancia no es nula, de lo contrario la creo:
El método en postExecute vaciará la instancia y la recreará. Por supuesto, esto se puede hacer fuera de la clase.
fuente
He hecho que mis tareas de rotación sean estáticas, lo que me ayudó a adjuntarlas, separarlas y volver a conectarlas a los hilos de la interfaz de usuario en los cambios de rotación. Pero para volver a su pregunta, lo que hago es crear una bandera para ver si el hilo se está ejecutando. Cuando desee reiniciar el hilo, verifico si la tarea de rotación se está ejecutando, si es, brindo una advertencia. Si no es así, lo hago nulo y luego creo uno nuevo, que evitará el error que está viendo. Además, al completar con éxito, anulo la tarea de reconocimiento de rotación completada para que esté lista para continuar nuevamente.
fuente
Sí, es cierto, el documento dice que solo se puede ejecutar un Asyntask.
Cada vez que necesite usarlo debe tener una instancia:
fuente