2010-04-26 13 views
44

En el documentation on AsyncTask se da lo siguiente como una regla relacionada con rosca:AsyncTask Threading Rule - ¿Se puede usar solo una vez?

  • La tarea se puede ejecutar sólo una vez (una excepción se produce si se intenta una segunda ejecución.)

Todo esto significa que debe crear una nueva instancia de la clase cada vez que quiera usarla, ¿verdad? En otras palabras, hay que hacerlo de esta manera:

new DownloadFilesTask().execute(url1, url2, url3); 
new DownloadFilesTask().execute(url4, url5, url6); 

O por el contrario, no se puede hacer lo siguiente:

DownloadFilesTask dfTask = new DownloadFilesTask(); 
dfTask.execute(url1, url2, url3); 
dfTask.execute(url4, url5, url6); 

se puede verificar esto es una interpretación correcta?

Me doy cuenta de que acabo de responder esto por mí mismo mientras escribía esto ... Pero no fue inmediatamente obvio para mí, así que creo que sería útil publicarlo de todos modos.

Respuesta

97

¿Alguien puede verificar que esta es una interpretación precisa de ?

Esa es una interpretación muy precisa.

+37

La mejor respuesta de la historia. – Adam

+3

Leyendo viejas preguntas SO y encuentro esta respuesta extremadamente entretenida. Me reí, y fue mucho. – davidcesarino

7

Hay otro problema 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 de nivel 11, PANAL) url1 y url4no serán descargados en paralelo. En particular, si se va a desconectar el contacto url1, la transferencia en url4 ni siquiera se iniciará hasta que se agote el tiempo de espera. A menos que especifique lo contrario explícitamente, todos los AsyncTasks son atendidos por el mismo hilo de trabajo único.

Los documentos dicen:

orden de ejecución

Cuando introdujo por primera vez, AsyncTasks fueron ejecutados en serie en un solo subproceso en segundo plano. Comenzando con DONUT, esto se cambió a un conjunto de subprocesos que permite que varias tareas funcionen en paralelo. Comenzando con HONEYCOMB, las tareas se ejecutan en un único hilo para evitar errores de aplicación comunes causados ​​por la ejecución paralela.

Si realmente desea la ejecución en paralelo, puede invocar executeOnExecutor (java.util.concurrent.Executor, Object []) conTHREAD_POOL_EXECUTOR.

+1

Sin embargo, tenga en cuenta que la pregunta es sobre un punto completamente diferente: si una instancia de AsyncTask puede reutilizarse. –

Cuestiones relacionadas