前言
多线程是开发中非常常见的,而线程之间通信的机制并不只有Handler。
今天我们就来说一说AsycTask的详解。
AsycTask
首先AsycTask是一个异步任务机制,最常见的用法便是用于子线程与主线程之间的通信,它有四个主要方法。
onPreExecute() 这个方法是在任务开始前进行的,它由UI线程(主线程)调用,即可以进行UI操作。在最后,我会给出Log的打印信息。
doInBackground() 这个方法是在onPreExecute方法后执行的,用于做在子线程里的操作。
onPostExecute(Result) 完成后,由UI线程调用,在这里处理Result。
onProgressUpdate(Progress…) 在publishProgress(Progress…)被调用之后,此方法会由UI线程调用。所以利用publishProgress(Progress…)和onProgressUpdate(Progress…)就能够做出在加载或读取网络数据时的等待或缓冲的UI效果。我在最后给出的效果图有类似的功能。
结合源码
首先是一个静态代码块,大家可以看到在代码块中创建了一个线程池,而静态代码块是在类装载的时候调用,所以该线程池很早就已经被创建。
在AsycTask的构造方法中创建了一个WorkerRunnable 它的本质是一个实现了Callable接口的类我们点进去看一下,因为实现了Callable接口所以他有一个call()方法再在里面发调用的doInBackground方法并获取该方法执行后返回的结果。
当我们调用AsyncTask.execute()方法时会将FutureTask提交到任务池并执行call()方法,我们看一下源码。
我们可以从上面的源码中看到 提交任务前 调用了 onPreExecute() 方法此方法用于做一些预操作,
之后才会将FutureTask提交到线程池执行call()方法。
而call()方法中调用的doInBackgrount()方法并且获取返回值。
运行完成之后调用FutureTask的done方法
get()获取call方法返回的结果,调用了postResultIfNotInvoked()方法我们接着点进去看一下
handler中判断调用了finesh方法亦或者onProgressUpdate方法,我们接着看一下finesh()方法。
可以看出在finesh()方法中调用的onPostExcute()方法将子线程获取到的结果进行更新ui或者其他操作。
到这AsycTask的讲解到此结束了,感谢观看!