AsyncTask, RejectedExecutionException y límite de tarea

Estoy buscando un montón de miniaturas de un servidor remoto y mostrarlos en una vista de cuadrícula, utilizando AsyncTask. El problema es que mi vista de cuadrícula muestra 20 miniaturas a la vez, por lo que se crean 20 AsyncTasks y se inicia 20 ejecuciones, una por cada miniatura.

Recibo la excepción de RejectedExecution en mi código. Recuerdo leer en alguna parte que hay un límite al número de tareas que AsyncTask puede tener en su cola a la vez, podría estar golpeando eso. ¿Se levantó este bar?

¿Hay alguna manera de aumentar este límite? ¿Es seguro ignorar esta excepción? (Teniendo un bloqueo vacío catch(RejectedException e){} block)

Estoy ejecutando este código en el emulador de Android 1.6 y el nivel de API en mi código (minSDKVersion es 3). [EDIT: Añadido información de nivel de SDK y API]

Recuerdo leer en alguna parte que hay un límite al número de tareas que AsyncTask puede tener en su cola a la vez, podría estar golpeando eso. ¿Se levantó este bar?

AsyncTask parece que actualmente admite 10 subprocesos y una profundidad de cola de trabajo de 10. En teoría, eso sólo soporta 20 elementos … si nada más está usando AsyncTask .

¿Hay alguna manera de aumentar este límite?

Coge el código fuente, modificarlo, ponerlo en tu propio paquete, y usarlo. Hice esto con mi AsyncTaskEx , aunque se basa en la fuente de Android 1.5.

¿Es seguro ignorar esta excepción?

Su trabajo no se pondrá en cola para su ejecución. Si eso es "seguro" depende de usted. No tengo conocimiento de ningún otro impacto en la infraestructura de AsyncTask .

He hecho exactamente lo mismo en una aplicación.

El lanzamiento de 20 hilos paralelos a la vez para descargar miniaturas de un servidor y empujarlos a un adaptador de datos no suena como una buena idea para mí. Todos esos hilos sólo se disparan uno encima del otro y se meten en el camino del otro.

En su lugar, lanzaría sólo un hilo, que recoja las miniaturas en un bucle y las agregue al adaptador a medida que lleguen.

Podría utilizar el ejecutor de serie con AsyncTask.executeOnExecutor, para serializar sus tareas, pero que limitará la tarea a una sola tarea simultánea en ese momento. Puede ser bueno, sin embargo al obtener miniaturas:

MyAsyncTask.executeOnExecutor (MyAsyncTask.SERIAL_EXECUTOR, [parámetros]);

El problema es que el número de AsyncTasks pendientes para AsyncTask.THREAD_POOL_EXECUTOR es 128. Una vez que se llena la cola, no se pueden poner en cola nuevas AsyncTasks.

Del código fuente de AsyncTask:

 private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(128); 

En mi opinión, ese límite no tiene absolutamente ningún sentido y AsyncTask.SERIAL_EXECUTOR tiene una cola ilimitada.

"Seguro" para ignorar – Debe asegurarse de que cualquier tipo de notificación que estaba planeando hacer en la post-ejecución se hará aquí cuando se captura el error – de lo contrario podría dejar algo colgando si su otro código hace suposiciones acerca de Escuchar de nuevo de esta tarea.

  • Error: No se pudo abrir el archivo zip. El caché de dependencias de Gradle puede estar dañado
  • Encuentra el error de javascript que estoy recibiendo en phonegap en android
  • Android.database.sqlite.SQLiteException: near ": error de sintaxis (código 1):, mientras que la compilación: android error de programación
  • No encontró la clase "com.google.firebase.provider.FirebaseInitProvider"
  • Manifiesto de Android que genera automáticamente permiso no válido
  • No se pudo encontrar la clase 'org.apache.http.entity.mime.content.Filebody', referenciada desde el método
  • Retrofit 2: responseBodyConverter convierte a objeto nulo
  • SecurityException: No se puede encontrar el campo para dex.jar
  • SQLite insert No hay error de columna en android
  • Manejo de errores de llamada síncrono de Retrofit 2 para errores 4xx
  • Capture todas las posibles excepciones de Android en todo el mundo y recargue la aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.