AsyncTask实现原理源码解析

作者: ac3268855153 | 来源:发表于2017-05-19 15:51 被阅读0次



    一切从task.execute(url);开始

    560行params就是我们传入的参数(url或者其他耗时操作所需要的参数) 另一个参数sDefaultExecutor就是一个SerialExecutor,如下图:

    先看下SerialExecutor是什么

    综合上面可以看出当sDefaultExecutor的execute(Runnable r)方法执行时会调用SerialExecutor的execute(final Runnable r)方法

    同时在execute方法中新建了一个子线程并在这个子线程中调用了传入的Runnable的run()方法,简单来说就是后面调用sDefaultExecutor的execute(Runnable r)方法时就会开启一个子线程在子线程中调用传入的Runnable的run方法,这是异步的核心

    回到上面executeOnExecutor(sDefaultExecutor, params);方法

    首先是状态判断,然后发现在子线程之前调用的onPreExecute();是在这里执行的  现在知道了onPreExecute()的调用时机

    接着往下看mWorker.mParams= params;将AsyncTask执行时传入的Params... params赋值个了mWorker的成员变量

    然后调用了exec.execute(mFuture);即sDefaultExecutor的execute(Runnable r)被调用了,所以mFuture是一个Runnable并且在子线程中执行了mFuture的run方法

    再来看看mWorker、mFuture到底是什么,

    从上面可以看出当实例化AsyncTask是这两个对象也被创建了,同时mFuture创建时把mWorker通过构造传入了

    前面说过mFuture是一个Runnable 我们先来看看是否是这样

    mFuture实现了RunnableFuture接口,而RunnableFuture接口继承了Runnable接口,故可以认为mFuture就是一个Runnable

    所以再来看看mFuture的run方法

    237行调用的c.call()方法 由232得知c就是callable  再来看看callable

    由上面构造得知callable就是创建FutureTask对象时传入的mWorker对象,所以最终mWorker的call()方法会被调用

    doInBackground(mParams);方法就被执行了,此处是在子线程中执行的

    在往后面看postResult(result)

    通过hander发送了一条消息 传递了一个AsyncTaskResult对象

    再来看看处理这个消息的handler

    result.mTask.finish(result.mData[0]);调用了result.mTask的finish方法 即AsyncTask的finish方法

    onPostExecute(result)、onCancelled(result)调用 在主线程中

    再来看看AsyncTask的线程处理

    236行创建了一个ArrayDeque,顾名思义这是一个双向队列,然后将执行异步任务的Runnable放入这个队列,然后从这个队列中取Runnable 通过线程池执行这个Runnable

    下面是使用AsyncTask下载多张图片时线程池的状态

    相关文章

      网友评论

        本文标题:AsyncTask实现原理源码解析

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