RejectedExecutionException de AsyncTask, pero no han alcanzado los límites

Mi aplicación de Android tiene que hacer frente a los mensajes que llegan con frecuencia que vienen en racimos (especialmente durante los períodos de conectividad escamosa). Manejo estos mensajes entrantes en AsyncTasks para que no interfiera con el subproceso de interfaz de usuario. Si reciben demasiados mensajes al mismo tiempo, obtengo una RejectedExecutionException . Mi pila de errores se ve así:

 10-22 14:44:49.398: E/AndroidRuntime(17834): Caused by: java.util.concurrent.RejectedExecutionException: Task android.os.AsyncTask$3@414cbe68 rejected from java.util.concurrent.ThreadPoolExecutor@412716b8[Running, pool size = 128, active threads = 22, queued tasks = 0, completed tasks = 1323] 10-22 14:44:49.398: E/AndroidRuntime(17834): at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:1967) 10-22 14:44:49.398: E/AndroidRuntime(17834): at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:782) 10-22 14:44:49.398: E/AndroidRuntime(17834): at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1303) 10-22 14:44:49.398: E/AndroidRuntime(17834): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:564) 

Estoy ejecutando las tareas con task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR) para que los mensajes entrantes se procesen en paralelo.

Lo que es confuso acerca de esto, y diferente de StackOverflow preguntas relacionadas que puedo encontrar (por ejemplo, aquí y aquí ), es que el número de hilos activos y las tareas en cola no parecen estar chocando contra los límites (que parecen ser 128 Y 10, respectivamente). Vea el stacktrace:

ThreadPoolExecutor@412716b8[Running, pool size = 128, active threads = 22, queued tasks = 0, completed tasks = 1323]

¿Por qué recibiría este mensaje de error?

2 Solutions collect form web for “RejectedExecutionException de AsyncTask, pero no han alcanzado los límites”

¿Por qué recibiría este mensaje de error?

Recibirá este mensaje de error si ha superado el número de tareas que pueden ser ThreadPoolExecutor cola por el ThreadPoolExecutor . La única vez que la RejectedExecutionException es lanzada es por el ThreadPoolExecutor.AbortPolicy que es el RejectedExecutionHandler predeterminado.

Para citar los javadocs :

Si una solicitud no se puede poner en cola, se crea un nuevo subproceso a menos que exceda de MaximumPoolSize, en cuyo caso, la tarea será rechazada.

Hay un número máximo de tareas. Vea esta pregunta / respuesta aquí: ¿Hay un límite de AsyncTasks para ser ejecutado al mismo tiempo?

Aquí hay un enlace para el código fuente de AsyncTask .

 private static final int CORE_POOL_SIZE = 5; private static final int MAXIMUM_POOL_SIZE = 128; private static final BlockingQueue<Runnable> sWorkQueue = new LinkedBlockingQueue<Runnable>(10); private static final ThreadPoolExecutor sExecutor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sWorkQueue, sThreadFactory); 

Así que parece que comienza en 5 hilos, tiene una cola de 10. Una vez que la cola está llena, puede iniciar hasta 128 hilos. Así que parece que han superado las 138 solicitudes simultáneas.

Esta excepción también se produce si el método de cierre de llamada de Executor y después de darle nueva tarea (Runnable) para su ejecución. Me gusta

 mThreadPoolExecutor.shutdown(); ... ... ... mThreadPoolExecutor.execute(new Runnable(){...}); 
  • Progressdialog lento para mostrar en Android
  • ¿Cómo detener un hilo?
  • ¿Debo hacer `Thread.currentThread (). Interrupt ()` before `throw new InterruptedIOException ()`?
  • Android: java.util.concurrent.ThreadPoolExecutor
  • Clase de aplicación que se ejecuta en el hilo de interfaz de usuario o?
  • Android equivalente de iOS GCD dispatch_group API
  • Ejecutar el hilo de otro hilo
  • Cómo comprobar si el hilo actual no es el hilo principal
  • ¿Los hilos añaden mucha sobrecarga a una aplicación?
  • Android Looper y pila de llamadas
  • Llamada Hilo principal de hilo secundario en Java / Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.