ASyncTask en Executor y PriorityBlockingQueue
Estoy tratando de hacer algunas ASyncTask para ejecutar simultáneamente con una prioridad.
He creado un ThreadPoolExecutor con un PriorityBlockingQueue y el comparador propper funciona bien para Runnables estándar. Pero al llamar
- Cómo actualizar la vista de imagen inmediatamente
- Pantalla secundaria de Android: persistencia a través de la invocación de actividad
- Tema Android tarea de seguridad
- Accediendo simultáneamente a diferentes miembros del mismo objeto en Java
- Android esperando el hilo de la interfaz de usuario
new Task().executeOnExecutor(threadPool, (Void[]) null);
El Comparador de PriorityBlockingQueue recibe un interno Runnable (privado) del ASyncTask (llamado mFuture en el código fuente), por lo que en el comparador no puedo identificar los ejecutables ni leer un valor de "prioridad".
¿Cómo puedo resolver eso? Gracias
- Nuevo hilo varias veces
- Android.os.networkonmainthreadexception dentro de un nuevo Thread
- ¿Cómo puedo mantener vivo un hilo de conexión? (¿Necesito usar un daemon?)
- ¿Una manera fácil de detectar dónde se está bloqueando el hilo de ui en Android?
- Android wait asynctask para terminar
- En android, ¿por qué la interfaz de usuario no se puede actualizar fuera del hilo de la interfaz de usuario?
- Cómo ejecutar un hilo Runnable en Android?
- Java.util.concurrent.TimeoutException android.view.ThreadedRenderer.finalize () tiempo de espera transcurridos 10 segundos
Obtenga el código fuente de android.os.AsyncTask y realice su propia implementación com.company.AsyncTask, donde puede controlar todo lo que desee en su propio código.
android.os.AsyncTask vienen con dos ejecutores preparados al horno, THREAD_POOL_EXECUTOR y SERIAL_EXECUTOR:
private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(10); /** * An {@link Executor} that can be used to execute tasks in parallel. */ public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory); /** * An {@link Executor} that executes tasks one at a time in serial * order. This serialization is global to a particular process. */ public static final Executor SERIAL_EXECUTOR = new SerialExecutor();
en su com.company.AsyncTask, cree otro PRIORITY_THREAD_POOL_EXECUTOR y envuelva toda su implementación dentro de esta clase (donde tiene visiablity a todos los campos internos) y use su AysncTask así:
com.company.AsyncTask asyncTask = new com.company.AsyncTask(); asyncTask.setPriority(1); asyncTask.executeOnExecutor(com.company.AsyncTask.PRIORITY_THREAD_POOL_EXECUTOR, (Void[]) null);
Echa un vistazo a mi respuesta aquí y ver cómo creo mi propio AsyncTask para ejecutar executeOnExecutor () funciona antes de API Nivel 11.
- android nfc configuración toggle oyente
- Ha habido un error al intentar inicializar el monoAndroidPackage