Simple Thread Management – Java – Android

Tengo una aplicación que genera un nuevo hilo cuando un usuario pide una imagen para ser filtrada.

Este es el único tipo de tarea que tengo y todos son de igual importancia.

Si solicito demasiados subprocesos simultáneos (Max que siempre quiero es 9) el gestor de subprocesos lanza una RejectedExecutionException .

En el minuto lo que hago es;

// Manage Concurrent Tasks private Queue<AsyncTask<Bitmap,Integer,Integer>> tasks = new LinkedList<AsyncTask<Bitmap,Integer,Integer>>(); @Override public int remainingSize() { return tasks.size(); } @Override public void addTask(AsyncTask<Bitmap, Integer, Integer> task) { try{ task.execute(currentThumbnail); while(!tasks.isEmpty()){ task = tasks.remove(); task.execute(currentThumbnail); } } catch (RejectedExecutionException r){ Log.i(TAG,"Caught RejectedExecutionException Exception - Adding task to Queue"); tasks.add(task); } } 

Simplemente agregue la tarea rechazada a una cola y la próxima vez que se inicie un hilo, se comprueba la cola para ver si hay un backlog.

El problema obvio con esto es que si la tarea final se rechaza en su primer intento nunca se reiniciará (hasta después de que ya no es necesario).

Sólo me pregunto si hay un modelo simple que debería usar para manejar este tipo de cosas. Necesito tareas para notificar a la cola cuando están hechas así que sé que hay espacio pero no estoy seguro cómo.

Saludos cordiales,

Gavin

3 Solutions collect form web for “Simple Thread Management – Java – Android”

La razón de la RejectedExecutionException es porque AsyncTask implementa un grupo de hilos propio (según la respuesta de Martelli), pero que está limitado a un máximo de 10 tareas simultáneas. ¿Por qué tienen ese límite, no tengo ni idea.

Por lo tanto, una posibilidad es para que usted pueda clonar AsyncTask , aumentar el límite (o ir sin límites, lo que también es posible con LinkedBlockingQueue ), y utilizar su clon. Luego, quizás, envíe el cambio como un parche a AsyncTask para futuras versiones de Android.

Haga clic aquí para ejecutar una búsqueda de código de Google para AsyncTask – el primer golpe debe ser la implementación.

Si sólo desea aumentar el límite, ajuste MAXIMUM_POOL_SIZE para que sea tan grande como sea probable que necesite. Si desea ir sin límites, utilice el constructor de LinkedBlockingQueue argumento LinkedBlockingQueue lugar del que se está utilizando actualmente. AFAICT, el resto del código probablemente permanece igual.

Parece que han implementado una versión del patrón de diseño de Thread Pool – el artículo de wikipedia señala muchos artículos útiles sobre el tema, que pueden ayudarle a refinar su implementación. También recomiendo este artículo específico de Java que tiene código claro y explicación.

Tal vez una opción es tener la tarea de espera en una cola de bloqueo (de mapas de bits) en lugar de tomar bitmap como un parámetro, pero tendrá que agregar una forma de las tareas para terminar.

  • Hilo con estados personalizados
  • Espere un hilo antes de continuar en Android
  • Cómo evitar la señal fatal 6 (SIGABRT) en android
  • ASyncTask en Executor y PriorityBlockingQueue
  • ¿Es legal llamar al método de inicio dos veces en el mismo hilo?
  • ¿Por qué run () es llamado una sola vez?
  • Cómo devolver un valor de hilo en java?
  • Nuevo Runnable () pero no nuevo hilo?
  • runOnUiThread no se está ejecutando en AsyncTask
  • Pasar un mensaje del hilo a la interfaz de usuario de actualización
  • El número de hilos activos sigue aumentando
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.