参考:
http://blog.csdn.net/lmj623565791/article/details/38614699
http://blog.csdn.net/singwhatiwanna/article/details/9272195
原理:
18行:设置当前AsyncTask的状态为RUNNING,上面的switch也可以看出,每个异步任务在完成前只能执行一次。
20行:执行了onPreExecute(),当前依然在UI线程,所以我们可以在其中做一些准备工作。
22行:将我们传入的参数赋值给了mWorker.mParams ,mWorker为一个Callable的子类,且在内部的call()方法中,调用了doInBackground(mParams),然后得到的返回值作为postResult的参数进行执行;postResult中通过sHandler发送消息,最终sHandler的handleMessage中完成onPostExecute的调用。
23行:exec.execute(mFuture),mFuture为真正的执行任务的单元,将mWorker进行封装,然后由sDefaultExecutor交给线程池进行执行。
对比Handler+Thread
1、Handler+Thread
麻烦之处在于UI的更新牵涉较多,单个异步后台显得代码过多,而且频繁的new thread也不好。但是多个后台比较清晰,可控性好。
2、AsyncTask
比较轻量级,单个后台可用,系统封装好的UI更新,但是不可太耗时(最多几秒)。
但是由于版本的问题,1.6之前,3.0以后是队列形式,中间版本是并发(最大支持128的并发,10个任务等待,即138个任务,超过则异常),但是也可强制开启多线程执行executeOnExecutor()