ASyncTask для Executor и PriorityBlockingQueue

Я пытаюсь запустить ASyncTask одновременно с приоритетом.

Я создаю ThreadPoolExecutor с PriorityBlockingQueue, и компаратор-компаньон отлично работает для стандартных Runnables. Но когда вы звоните

new Task().executeOnExecutor(threadPool, (Void[]) null); 

Компаратор PriorityBlockingQueue получает Runnable (частный) внутренний ASyncTask (называемый mFuture в исходном коде), поэтому в компараторе я не могу идентифицировать runnables или читать значение «приоритет».

Как я могу это решить? благодаря

Заимствуйте исходный код из android.os.AsyncTask и создайте собственную реализацию com.company.AsyncTask, где вы можете управлять всем, что захотите, в своем собственном коде.

Android.os.AsyncTask поставляются с двумя готовыми выпеченными исполнителями, THREAD_POOL_EXECUTOR и 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(); 

В com.company.AsyncTask, создайте еще один PRIORITY_THREAD_POOL_EXECUTOR и завершите всю свою реализацию в этом классе (там, где у вас есть видимость ко всем внутренним полям) и используйте AysncTask следующим образом:

 com.company.AsyncTask asyncTask = new com.company.AsyncTask(); asyncTask.setPriority(1); asyncTask.executeOnExecutor(com.company.AsyncTask.PRIORITY_THREAD_POOL_EXECUTOR, (Void[]) null); 

Посмотрите мой ответ здесь и посмотрите, как я создаю свою собственную AsyncTask, чтобы сделать executeOnExecutor () работает до уровня API 11.