android - hilos - AsyncTask Threading Rule: ¿se puede usar solo una vez?
hilos asynctask android (2)
¿Puede alguien verificar que esta es una interpretación precisa?
Esa es una interpretación muy precisa.
En la documentación sobre AsyncTask, se proporciona lo siguiente como una regla relacionada con el enhebrado:
- La tarea se puede ejecutar solo una vez (se lanzará una excepción si se intenta una segunda ejecución).
Todo esto significa que tienes que crear una nueva instancia de la clase cada vez que quieras usarla, ¿verdad? En otras palabras, debe hacerse así:
new DownloadFilesTask().execute(url1, url2, url3);
new DownloadFilesTask().execute(url4, url5, url6);
O a la inversa, NO puedes hacer lo siguiente:
DownloadFilesTask dfTask = new DownloadFilesTask();
dfTask.execute(url1, url2, url3);
dfTask.execute(url4, url5, url6);
¿Puede alguien verificar que esta es una interpretación precisa?
Me doy cuenta de que prácticamente solo respondí esto por mí mismo mientras escribía esto ... Pero no fue inmediatamente obvio para mí, así que creo que sería útil haber publicado.
Hay un gotcha más con AsyncTasks. Tenga en cuenta que en el ejemplo
new DownloadFilesTask().execute(url1, url2, url3);
new DownloadFilesTask().execute(url4, url5, url6);
ejecutado en Android 3+ (API nivel 11, HONEYCOMB) url1
y url4
no se descargarán en paralelo. En particular, si ponerse en contacto con url1
va a url1
, la transferencia en url4
ni siquiera comenzará hasta que se agote. A menos que especifique explícitamente lo contrario, todas las AsyncTasks son atendidas por el mismo subproceso de trabajo único.
Los docs dicen:
Orden de ejecución
Cuando se introdujo por primera vez, las AsyncTasks se ejecutaron en serie en un solo hilo de fondo. Comenzando con DONUT, esto se cambió a un grupo de subprocesos permitiendo que múltiples tareas funcionen en paralelo. A partir de HONEYCOMB, las tareas se ejecutan en un solo hilo para evitar errores comunes de aplicación causados por la ejecución en paralelo.
Si realmente desea una ejecución paralela, puede invocar executeOnExecutor (java.util.concurrent.Executor, Object []) con THREAD_POOL_EXECUTOR
.