欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android多线程开发 AsycTask源码功能方法解析

程序员文章站 2022-03-11 23:23:14
前言多线程是开发中非常常见的,而线程之间通信的机制并不只有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效果。我在最后给出的效果图有类似的功能。

结合源码

android多线程开发 AsycTask源码功能方法解析

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

android多线程开发 AsycTask源码功能方法解析

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

android多线程开发 AsycTask源码功能方法解析

当我们调用AsyncTask.execute()方法时会将FutureTask提交到任务池并执行call()方法,我们看一下源码。android多线程开发 AsycTask源码功能方法解析

android多线程开发 AsycTask源码功能方法解析

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

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

android多线程开发 AsycTask源码功能方法解析

运行完成之后调用FutureTask的done方法android多线程开发 AsycTask源码功能方法解析

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

android多线程开发 AsycTask源码功能方法解析

android多线程开发 AsycTask源码功能方法解析

android多线程开发 AsycTask源码功能方法解析

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

android多线程开发 AsycTask源码功能方法解析

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

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

本文地址:https://blog.csdn.net/qq_48021641/article/details/108141093