一切从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下载多张图片时线程池的状态