3

我正在尝试让一些 ASyncTask 优先同时运行。

我已经创建了一个带有 PriorityBlockingQueue 的 ThreadPoolExecutor,并且适当的比较器适用于标准 Runnables。但是打电话的时候

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

PriorityBlockingQueue 的 Comparator 接收 ASyncTask 内部的 Runnable(私有)(在源代码中称为 mFuture),因此在比较器中我无法识别可运行对象或读取“优先级”值。

我该如何解决?谢谢

4

1 回答 1

6

从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 之前工作。

于 2012-08-20T22:16:30.087 回答