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?
- Actividad global de manejo de errores e informes de Android
- Cómo manejar el error en Retrofit 2.0
- SecurityException: No se puede encontrar el campo para dex.jar android
- Android setError ("error") no funciona en Textview
- Android: No obtengo stacktrace, el teléfono solo cuelga
¿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]
- AbsListView unregisterIRListener () se llama
- ¿Puedes detectar un error de JNI en una biblioteca de terceros antes de un duro choque?
- Quitar fragmento de bloqueo
- Validar precondiciones de función en android
- Compruebe si DAY_OF_WEEK es entre el lunes y el viernes
- Mostrar diálogo sobre error de red utilizando Retrofit y Rxjava
- Android ADB Logcat: muestra logcat completo
- Java.lang.OutOfMemoryError BitmapFactory.nativeDecodeAsset ()
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.
- ¿Cómo pasar un objeto personalizado en Bundle?
- Android – el diseño parece desordenado en algunos dispositivos