11

Necesito ejecutar un número de AsyncTask sy luego reunir todos sus resultados, consolidar y luego devolver el resultado final a mi usuario.¿Cómo usar ExecutorService con Android AsyncTask?

Estoy buscando una manera de administrar múltiples AsyncTask s en Android. Estoy pensando en usar un ExecutorService del paquete Java Concurrency pero me quedé porque ExecutorService toma Runnables o Callables SOLAMENTE. Para establecer mi requerimiento puedo usar el

ExecutorService.invokeAll((Collection<? extends Callable<T>> tasks)

invokeAll() El método devolverá una lista de List<Future><V>> sólo cuando se hayan completado todas las tareas presentadas y puedo conseguir mis resultados para cada tarea desde su correspondiente Future.

Todo está bien con ExecutorService espera por el hecho de que no acepta AsyncTask.

¿Hay alguna otra manera de usar AsyncTask y ExecutorService o si puede por favor recomendar un enfoque diferente.

+1

Lo bueno es que [AsyncTask] (http://developer.android.com/reference/android/os/AsyncTask.html) tiene el método executeOnExecutor(), lo malo es que solo está disponible desde el nivel 11 de API – yorkw

+0

Cualquier referencia sobre cómo usar executeOnExecutor? Además, esta característica está disponible en HoneyComb (Nivel 11 de la API) pero el minSDK de mi aplicación es 4. – AKh

+1

Si insistes, mira mi respuesta [aquí] (http://stackoverflow.com/questions/7211684/asynctask-executeonexecutor-antes- api-level-11/9509184 # 9509184). – yorkw

Respuesta

1

Crea un AsyncTask y comienza tus hilos desde doInBackground(). Cuando hayan terminado, recopile, consolide, etc. los datos y devuélvalos. Luego puede usarlo en onPostExecute para actualizar la interfaz de usuario. Iniciar demasiados subprocesos consumirá memoria, por lo que debe considerar si realmente necesitan ejecutarse en paralelo.

+0

AsyncTask en sí tiene un conjunto de hilos dentro. ¿Podemos usar este grupo para ejecutar múltiples tareas en lugar de crear otro? – AKh

+1

No directamente. En cuanto a 'executeOnExecutor()', el propósito de este método es hacer posible ejecutar múltiples 'AsyncTask' simultáneamente, ya que el interno solo puede ejecutar una' AsyncTask' a la vez (Honeycomb y posterior). Lo que eso significa es que si inicia dos 'AsyncTask's más o menos al mismo tiempo, el segundo esperará a que el primero termine antes de que comience. Si necesita hacer algo más complicado, no tiene que usar 'AsyncTask', solo su código de enhebrado como de costumbre y use un Manejador para notificar a la IU cuando obtiene los resultados. –

+0

No es VERDADERO que "Lo que eso significa es que si inicia dos AsyncTasks más o menos al mismo tiempo, el segundo esperará a que el primero termine antes de que comience" – Zou

Cuestiones relacionadas