Pregunta

Me retracto un montón de imágenes en miniatura de un servidor remoto y los muestra en una vista de cuadrícula, utilizando AsyncTask. El problema es que mi punto de vista de cuadrícula muestra 20 miniaturas a la vez, lo que crea AsyncTasks 20 y 20 ejecuta comienza, uno por cada miniatura.

consigo excepción RejectedExecution en mi código. Recuerdo algún lugar de leer que hay un límite al número de tareas que AsyncTask puede tener en su cola a la vez, yo podría estar golpeando eso. Fue levantada este bar?

¿Hay una manera de aumentar este límite? ¿Es seguro simplemente ignorar esta excepción? (Por tener un bloque catch(RejectedException e){} vacío?)

Me postulo este código en Android 1.6 emulador y el nivel de la API en mi código (minSdkVersion es 3). [EDIT: Agregado SDK y API de nivel info]

¿Fue útil?

Solución

  

Recuerdo que en algún lugar hay que leer   es un límite para el número de tareas que   AsyncTask puede tener en su cola en una   tiempo, que podría estar afectando a eso. Estaba   esta barra levantada?

AsyncTask parece apoyar actualmente 10 hilos y una profundidad de cola de trabajos 10. En teoría, que acaba de soporte 20 artículos ... si no otra cosa es el uso de AsyncTask.

  

¿Hay una manera de aumentar este límite?

Grab el código fuente, modificarlo, lo puso en su propio paquete, y el uso que uno. Hice esto con mi AsyncTaskEx , sin embargo, que se basa en la fuente de Android 1.5.

  

¿Es seguro simplemente ignorar este   excepción?

Su trabajo no se pone en cola para su ejecución. Ya sea que es "seguro" depende de usted. No estoy al tanto de cualquier otro impacto sobre la infraestructura AsyncTask.

Otros consejos

He hecho esto exactamente lo mismo a mí mismo en una aplicación.

El lanzamiento de 20 hilos paralelos a la vez para descargar imágenes en miniatura de un servidor y empujarlos a un adaptador de datos no suena como una idea buena para mí. Todos esos hilos se acaba de viaje uno encima del otro y ponerse en el camino del otro.

En su lugar, me gustaría lanzar un solo hilo, tiene que recoger las miniaturas en un bucle, y añadirlos al adaptador a medida que llegan.

Se podría utilizar el ejecutor serie con AsyncTask.executeOnExecutor, para serializar sus tareas, sino que limitará la tarea a una sola tarea concurrente en el momento. Puede ser bueno, aunque cuando conseguir miniaturas:

myAsyncTask.executeOnExecutor (MyAsyncTask.SERIAL_EXECUTOR, [params]);

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

A partir de código fuente AsyncTask:

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

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

"seguro" para ignorar - Es necesario asegurarse de que cualquier tipo de notificación que se planea hacer en el post-ejecución se hará aquí cuando se captura el error - de lo contrario podría dejar algo para colgar si su otro código hace suposiciones sobre la audición de vuelta de esta tarea.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top