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(){...}); 
  • Afinidad de hilo para Android
  • ¿Puede alguien explicar por favor cómo startActivity (intención) y startActivityForResult (intención) son asíncronos?
  • Cómo utilizar runOnUiThread sin obtener "no puede hacer una referencia estática al método no estático" error de compilador
  • ¿Cuándo necesitamos usar runOnUiThread en la aplicación android?
  • Cómo pausar / reanudar el hilo en Android?
  • ¿Cuál es la mejor práctica para hacer llamadas http en android
  • Android AsyncTask.THREAD_POOL_EXECUTOR vs ThreadPool personalizado con Runnables
  • ¿Una manera fácil de detectar dónde se está bloqueando el hilo de ui en Android?
  • Cómo tener múltiples conexiones a un solo dispositivo bluetooth Obd2 conectado al coche
  • Java.lang.RuntimeException: Sólo se puede crear un Looper por subproceso
  • Android: forma estándar de hacer correr un hilo cada segundo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.