android - AsyncTask SerialExecutor 是如何工作的?

标签 android android-asynctask

private static class SerialExecutor implements Executor {
    final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();
    Runnable mActive;

    public synchronized void execute(final Runnable r) {
        mTasks.offer(new Runnable() {
            public void run() {
                try {
                    r.run();
                } finally {
                    scheduleNext();
                }
            }
        });
        if (mActive == null) {
            scheduleNext();
        }
    }

    protected synchronized void scheduleNext() {
        if ((mActive = mTasks.poll()) != null) {
            THREAD_POOL_EXECUTOR.execute(mActive);
        }
    }
}

上面的代码 fragment 来自实现 SerialExcutor 的 AsyncTask 源代码,但我不明白它是如何工作的。

当一个新任务到达时,它被放入一个ArrayDeque的末尾,只有当当前没有其他任务正在执行时,ArrayDeque顶部的任务才会被执行。 (当 mActive == null 时)。

那么如果一个任务正在执行,当一个新任务到来时,什么都不会被触发,当任务执行完,ArrayDeque怎么知道弹出最上面的下一个任务来执行它???

最佳答案

任务由接受 RunnableTHREAD_POOL_EXECUTOR 在单独的线程上执行。在这个 Runnable 中,当运行的任务由于某种原因完成时, scheduleNext()finally block 中被调用。如果队列中有任何任务,第一个将被执行,否则执行器将空闲直到下一次调用 execute()。此外,synchronized 确保 execute()scheduleNext() 不能同时在不同的线程中运行。

关于android - AsyncTask SerialExecutor 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19207811/

相关文章:

java - 数据类型参数旁边的省略号是什么意思?

Android 应用程序有时会在启动时崩溃

java - Android 中的上下文菜单

android - 动态调整小部件的内容和布局到用户通过 resize 定义的大小。安卓

android - zxing lib 无法在纵向模式下顺利检测到二维码

在后台线程完成之前,Android ASync 任务 ProgressDialog 不会显示

android - Android 单声道 : Unicode Assets file names can't be packaged

java - 找不到类 'android.support.v4.widget.DrawerLayout$1',从方法 android.support.v4.widget.DrawerLayout 引用

android - ProgressDialog 没有出现在 onProgressUpdate 方法中

android - 将图像加载异步任务转换为 rxjava,为什么它滞后于 ui?