2012-03-07 18 views
6

Esto debería tener una respuesta fácil, pero no pude encontrar ninguna. Y como todavía soy un muñeco androide, vine aquí para preguntarle a la gente.¿Hay un límite de AsyncTasks para ejecutarse al mismo tiempo?

He estado haciendo este proyecto que ejecuta 10 AsyncTasks en el inicio. Cada tarea contiene 3 URL que recopilan datos allí y no hacen nada importante en la aplicación (aún).

También tengo 10 textviews que utilizo para hacer un seguimiento del progreso de las AsyncTasks.

Cuando una tarea se inicia el TextView adecuada se pone en "Inicio" Cuando una tarea está progresando establece su TextView apropiado "Descarga" Cuando se termina una tarea que establece su TextView apropiado "Terminado"

Esto es lo que observé y me preguntaron sobre AsyncTask. Cuando inicio la aplicación, noto que 5 de las textviews están cambiando al marcador "Descargando", así que veo 5 AsyncTasks haciendo su trabajo como deberían. Cuando termine, inicia una nueva AsyncTask. Sin embargo, nunca superan ese límite de 5.

¿Qué ocasiona que este límite de 5 AsynchTasks se ejecute al mismo tiempo? ¿Causé esto en algún archivo que no puedo encontrar? ¿Es este un límite de Android 2.3.3? ¿Tal vez un límite del dispositivo que estoy usando para simular la aplicación?

¿Alguien puede elaborar para mí?

+0

Esta pregunta se trata aquí: http://stackoverflow.com/questions/3077461/asynctask-threads-never-die-android – jengelsma

+0

@jengelsma No realmente. Definitivamente está relacionado, pero por qué no pasa de 5 es algo diferente de por qué nunca pasa por debajo de 5. Todavía tiene que ver con el tamaño del grupo central, pero esa pregunta/respuesta no aborda por qué ese tamaño de grupo central limitaría el número de tareas simultáneas en 5 cuando el tamaño máximo de la agrupación es 128. – kabuko

+0

Creo que está utilizando AsyncTask.execute() en lugar de AsyncTask.executeOnExecutor() –

Respuesta

8

Sí, hay un límite. AsyncTask está respaldado por un ThreadPoolExecutor con un tamaño de grupo principal de 5, pero un tamaño de grupo máximo de 128 (de 1.6 a 4.0.3), así que realmente creo que debería ver todos los 10 ejecutados a la vez. No puedes cambiarlo sin embargo. Si realmente quieres hacer algo diferente (y no lo recomendaría a menos que tengas una razón muy específica), tendrás que hacer algo personalizado con un tamaño de grupo mayor o simplemente girar un manojo de hilos manualmente.

Actualización:

es lo que los doctores dicen aquí:

Si hay más de corePoolSize pero menos de hilos maximumPoolSize correr, se creará un nuevo hilo sólo si la cola está llena.

Por eso. Su cola no está llena, por lo que solo la mantiene en el tamaño del grupo principal.

+0

Aquí hay un enlace a la fuente de [AsyncTask] (http: // grepcode .com/file/repository.grepcode.com/java/ext/com.google.android/android/1.6_r2/android/os/AsyncTask.java # AsyncTask) para referencia. – kabuko

+2

Puede suministrar una instancia arbitraria de 'Ejecutor' a' executeOnExecutor() 'si desea personalizar cómo se manejan sus' AsyncTask's. – Argyle

+1

@Argyle buen punto; esa es una buena opción para API 11 en adelante. – kabuko

0

El ThreadPoolExecutor tiene un corePoolSize, un maxPoolSize y una QueueCapacity. Si se utilizan todos los subprocesos de corePoolSize, cualquier otra tarea se coloca en la cola de cada uno de los subprocesos del grupo de núcleos. Después de que estas colas estén llenas, se está inicializando un nuevo subproceso, siempre que esté dentro de los límites de maxPoolSize.

El problema aquí es que las colas de cada hilo (a menos que se cambien por programación) son UNBOUNDED. Esto significa que se utilizan todos los subprocesos del tamaño del grupo de servidores principales, y cualquier otra tarea se pone en cola y espera su turno con uno de los hilos principales. Nunca tienen la posibilidad de alcanzar el tamaño máximo de la piscina.

Debe configurar su propio ejecutor y cambiar la capacidad de la cola. ¡Buena suerte!

Cuestiones relacionadas