android AsycTask详解源码

   日期:2020-08-24     浏览:96    评论:0    
核心提示:前言多线程是开发中非常常见的,而线程之间通信的机制并不只有Handler。今天我们就来说一说AsycTask的详解。AsycTask首先AsycTask是一个异步任务机制,最常见的用法便是用于子线程与主线程之间的通信,它有四个主要方法。onPreExecute() 这个方法是在任务开始前进行的,它由UI线程(主线程)调用,即可以进行UI操作。在最后,我会给出Log的打印信息。doInBackground() 这个方法是在onPreExecute方法后执行的,用于做在子线程里的操作。onPost

前言

多线程是开发中非常常见的,而线程之间通信的机制并不只有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的讲解到此结束了,感谢观看!

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服