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?

¿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(){...}); 
  • Modo de depuración de Android Eclipse - Temas
  • Java.lang.RuntimeException: Sólo se puede crear un Looper por subproceso
  • Puedo matar o terminar () una actividad en un hilo que no sea el hilo de la interfaz de usuario ...?
  • Android - Cargando, por favor espere
  • ¿Hay una manera de pasar parámetros a un Runnable?
  • Corrección multihilo: Utilización de bloqueo sincronizado
  • Android- Thread.join () hace que la aplicación se bloquee
  • ¿Es Thread.sleep (x) lo suficientemente preciso como para usarlo como reloj en Android?
  • Manera eficiente de manipular los subprocesos RxJava
  • Runnable se publica correctamente pero no se ejecuta
  • Android "Sólo el subproceso original que creó una jerarquía de vistas puede tocar sus vistas."
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.