android AsycTask详解源码

前言

多线程是开发中非常常见的,而线程之间通信的机制并不只有Handler。

今天我们就来说一说AsycTask的详解。

AsycTask

首先AsycTask是一个异步任务机制,最常见的用法便是用于子线程与主线程之间的通信,它有四个主要方法。

onPreExecute() 这个方法是在任务开始前进行的,它由UI线程(主线程)调用,即可以进行UI操作。在最后,我会给出Log的打印信息。

doInBackground() 这个方法是在onPreExecute方法后执行的,用于做在子线程里的操作。

onPostExecute(Result) 完成后,由UI线程调用,在这里处理Result。

onProgressUpdate(Progress…) 在publishProgress(Progress…)被调用之后,此方法会由UI线程调用。所以利用publishProgress(Progress…)和onProgressUpdate(Progress…)就能够做出在加载或读取网络数据时的等待或缓冲的UI效果。我在最后给出的效果图有类似的功能。

结合源码

android AsycTask详解源码_第1张图片

首先是一个静态代码块,大家可以看到在代码块中创建了一个线程池,而静态代码块是在类装载的时候调用,所以该线程池很早就已经被创建。

android AsycTask详解源码_第2张图片

在AsycTask的构造方法中创建了一个WorkerRunnable 它的本质是一个实现了Callable接口的类我们点进去看一下,因为实现了Callable接口所以他有一个call()方法再在里面发调用的doInBackground方法并获取该方法执行后返回的结果。

android AsycTask详解源码_第3张图片

当我们调用AsyncTask.execute()方法时会将FutureTask提交到任务池并执行call()方法,我们看一下源码。android AsycTask详解源码_第4张图片

android AsycTask详解源码_第5张图片

我们可以从上面的源码中看到 提交任务前 调用了 onPreExecute() 方法此方法用于做一些预操作,
之后才会将FutureTask提交到线程池执行call()方法。

而call()方法中调用的doInBackgrount()方法并且获取返回值。

android AsycTask详解源码_第6张图片

运行完成之后调用FutureTask的done方法android AsycTask详解源码_第7张图片

get()获取call方法返回的结果,调用了postResultIfNotInvoked()方法我们接着点进去看一下

android AsycTask详解源码_第8张图片

android AsycTask详解源码_第9张图片

android AsycTask详解源码_第10张图片

handler中判断调用了finesh方法亦或者onProgressUpdate方法,我们接着看一下finesh()方法。

android AsycTask详解源码_第11张图片

可以看出在finesh()方法中调用的onPostExcute()方法将子线程获取到的结果进行更新ui或者其他操作。

到这AsycTask的讲解到此结束了,感谢观看!

你可能感兴趣的:(多线程,AcyncTask,异步操作,android,多线程,asynctask)