¿Hay un límite de AsyncTasks para ejecutarse al mismo tiempo?

Esto debería tener una respuesta fácil, pero no pude encontrar ninguna. Y como todavía soy un maniquí androide, vine a preguntarle a la gente.

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

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

Cuando se inicia una tarea, la vista de texto apropiada se pone en "Inicio" Cuando una tarea avanza, establece su texto apropiado en "Descarga" Cuando una tarea termina, establece su texto apropiado en "Finalizado"

Esto es lo que observé y llegué a cuestionar el AsyncTask. Cuando comienzo la aplicación noto 5 de las textviews que son cambiadas al "Downloading" marcador, así que veo 5 AsyncTasks que hacen su trabajo como deben. Cuando se hace, se inicia una nueva AsyncTask. Sin embargo, nunca alcanzan ese límite de 5.

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

¿Puede alguien elaborar para mí?

    Sí, hay un límite. AsyncTask está respaldado por un ThreadPoolExecutor con un tamaño de pool de núcleo de 5, pero un tamaño máximo de pool de 128 (de 1.6 a 4.0.3), así que realmente creo que debería ver todos los 10 de su ejecución a la vez. No puedes cambiarlo. 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 piscina más grande o simplemente girar un montón de hilos manualmente.

    Actualizar:

    Esto es lo que dicen los docs:

    Si hay más de corePoolSize pero menos de threads maximumPoolSize en ejecución, se creará un nuevo subproceso solo si la cola está llena.

    Asi que es por eso. Su cola no está llena, por lo que sólo lo mantiene en el tamaño de la piscina núcleo.

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

    La captura aquí es que las colas de cada subproceso (a menos que se cambie programatically) son UNBOUNDED . Esto significa que se utilizan todos los subprocesos del tamaño de la agrupación central y que todas las demás tareas están en cola y esperan su turno con uno de los subprocesos principales. Nunca tienen la oportunidad de alcanzar el tamaño máximo de la piscina.

    Tienes que configurar tu propio Executor y cambiar la capacidad de la cola. ¡Buena suerte!

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.