美文网首页
AsyncTask原理分析

AsyncTask原理分析

作者: 著名的 | 来源:发表于2017-09-26 22:07 被阅读6次

AsyncTask在安卓中常用于线程间通信。在子线程执行耗时任务,在主线程更新UI。

AsyncTask内部封装了Handler和线程池。

1、AsyncTask主要靠InternalHandler去跟主线程通信,InternalHandler继承自Handler类,在handleMessage方法里面处理了消息。

private static class InternalHandler extends Handler {
        public InternalHandler() {
            super(Looper.getMainLooper());
        }

        @SuppressWarnings({"unchecked", "RawUseOfParameterizedType"})
        @Override
        public void handleMessage(Message msg) {
            AsyncTaskResult<?> result = (AsyncTaskResult<?>) msg.obj;
            switch (msg.what) {
                case MESSAGE_POST_RESULT:
                    // There is only one result
                    result.mTask.finish(result.mData[0]);
                    break;
                case MESSAGE_POST_PROGRESS:
                    result.mTask.onProgressUpdate(result.mData);
                    break;
            }
        }
    }

2、有两个线程池THREAD_POOL_EXECUTOR和SERIAL_EXECUTOR
SERIAL_EXECUTOR负责队列管理,负责执行任务的是THREAD_POOL_EXECUTOR

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);
            }
        }
    }

回过头来,咱们再来看看executeOnExecutor方法

@MainThread
    public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec,
            Params... params) {
        if (mStatus != Status.PENDING) {
            switch (mStatus) {
                case RUNNING:
                    throw new IllegalStateException("Cannot execute task:"
                            + " the task is already running.");
                case FINISHED:
                    throw new IllegalStateException("Cannot execute task:"
                            + " the task has already been executed "
                            + "(a task can be executed only once)");
            }
        }

        mStatus = Status.RUNNING;

        onPreExecute();

        mWorker.mParams = params;
        exec.execute(mFuture);

        return this;
    }

这个方法里面做了下状态判断和状态修改,所以可以看出,一个AsyncTask实例只能执行一次。然后分别调用了onPreExecute和exec.execute(mFuture),这里的exec就是SERIAL_EXECUTOR,调用exec.execute(mFuture)就是把任务插入到任务队列中。然后依次执行任务。

相关文章

  • AsyncTask工作原理

    AsyncTask工作原理调用图 AsyncTask工作原理源码分析,建议配合调用图一起看 调用 AsyncTas...

  • 详细解读AsyncTask的黑暗面以及一种替代方案

    基于最新版本的AsyncTask详细解读主要是一些AsyncTask的原理解读,本篇将分析AsyncTask使用的...

  • Asynctask原理分析

    Asynctask是一种轻量级异步任务类,任务是在线程池中执行后台任务的,并将结果返回到UI界面。它封装了hand...

  • AsyncTask原理分析

    -----基于Android6.0分析AsyncTask是一个抽象类,我们去使用它的时候需要创建一个子类继承它。它...

  • AsyncTask原理分析

    AsyncTask在安卓中常用于线程间通信。在子线程执行耗时任务,在主线程更新UI。 AsyncTask内部封装了...

  • AsyncTask原理分析

    线程池ThreadPoolExecutorJDK5带来的一大改进就是Java的并发能力,它提供了三种并发武器:并发...

  • AsyncTask原理分析

    以下分析基于android-27 AsyncTask使用方法 2.在新建对象时候主要调用 执行execute()的...

  • AsyncTask原理分析

    引言 在打算写分析AsyncTask这篇文章之前,比较犹豫要不要写这篇文章。因为AsyncTask目前的开发中基本...

  • AsyncTask工作原理分析

    AsyncTask 相信大家对他的使用并不陌生,它是谷歌官方提供的一种轻量级别的异步任务类,底层封装的是两个线程池...

  • 自定义一个AsyncTask

    上一篇我们分析类AsyncTask原理,但想要真正的掌握还是要动手自己实现一个AsyncTask,下面我们就开始参...

网友评论

      本文标题:AsyncTask原理分析

      本文链接:https://www.haomeiwen.com/subject/vuweextx.html