AsyncTask工作原理复习总结

综合技术 2018-01-03

上周闲来无事就去某些大公司面试了一下,试试现在android这块的水!总结出结论就是,稍大点的公司问的基础的东西还是比较的多,而规模较小的公司则是更注重模块功能点的实现!所以呢,你未来职业的发展得有个大体的规划,大公司呢,就多注意一下基础知识和整体框架的把握,而规模稍小的公司则需要你将某些功能块挖的深一些!这是我个人的感觉,哈哈!仅供参考!

进入正题!

AsyncTask已经出来太久了,以至于我们可以很熟悉的用它!那它是怎么工作的呢?之前在学习android的时候,看过它的源码实现!但是实在太久了,差不多都忘光了!今天早上手上的事情做完后无聊,就又走了一遍,突然感觉看别人的源码比自己撸代码还要舒服!

这里写图片描述

我们先从实例化AsyncTask开始逐步了解!

这里写图片描述

OK,我们聊一下这张图!从WorkerRunnable中我们看到了AsyncTask的一个重要方法doInBackfround()是在这个方法中执行的!然后再将WorkerRunnable的引用添加到了FutureTask中执行结果回调。所以说基本可以确定这是在子线程中的,当然还有一行代码可以证明:

Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

这行代码什么意思呢?

这里写图片描述

标准后台线程。这让你的线程低于正常的优先级,这样会保证用户界面的响应性。

OK,看到这即可了!我们不能盲目的钻到理解代码的详细细节上,不然就出不去了!

AsyncTask实例化完了,我们就改看看他是怎么执行的吧!执行的话,我们通常会调用它的execute()方法。

这里写图片描述

嗯,知识简单的执行了一个函数,并传入了两个参数!sDefaultExecutor和params,第二个参数,不用说了,就是我们自己传入的参数,第一个呢?

这里写图片描述

嗯,它是SerialExecutor的实例化对象,实现了Executor,重要的是下面这行代码:

final ArrayDeque mTasks = new ArrayDeque();

SerialExecutor通过ArrayDeque控制管理线程池中的Runnable对象,其原理是队列,先进先出形式!

看看它提供的offer方法:

这里写图片描述

很简单的翻译吧!在队未添加一个Runnable元素。

再看poll方法:

这里写图片描述

取出并移除顶部元素

嗯,大概明白了!SerialExecutor是一个线程池,它通过ArrayDeque来控制线程Runnable的执行顺序!也就是说SerialExecutor是一个排队的线程池!

接着说executeOnExecutor(),它将SerialExecutor和params(我们自己设置的参数)传过去了!

这里写图片描述

哈哈,是不是看到了执行流程了?

Pending(等待)-->Running(运行)-->Finished(结束)

如果非等待状态,那就不好意思了!抛出了异常!

如果是等待状态则执行:

mStatus更改为RUNNING状态;

onPreExecute();执行之前预备状态

mWorker.mParams = params;设置传过来的参数

exec.execute(mFuture);开始执行

exec则是我们传过来的SerialExecutor,而mFuture则是我们在实例化的时候生成的子线容器!

回过头再看SerialExecutor

这里写图片描述

在执行 r.run()后,我们怎么获得执行的结果呢?

这里写图片描述

FutureTask执行完成后必会调用

protected void done()

那就会执行postResultIfNotInvoked(get());

接着

这里写图片描述

再接着实例化Handler;

这里写图片描述

Handler发送消息进行处理:

这里写图片描述

这个主意的是,在super(Looper.getMainLooper());执行后,又回到到了主线程!而在执行finish方法的时候,调用了onPostExecute(result);使得结果得到了回调成功!

这里写图片描述

OK,执行流程大概就是这么个样子!

总结:

总的来说AsyncTask的内部封装了SERIAL_EXECUTOR(排队线程池),THREAD_POOL_EXECUTOR(执行线程池),以WorkerRunnable为子线程封装可回调控制操作的FutureTask子线程,以及用于更新界面的一个内部InternalHandler,这么一个结构,理解起来并不是很难!关键是人家的这种设计和一些api的合理使用!

闲话少说,年关了,估计大伙都蠢蠢欲动!加油吧!

每天进步一点点,时间会让你成为巨人!

简书

责编内容by:简书 (源链)。感谢您的支持!

您可能感兴趣的

Android Fragments. Retaining an AsyncTa... I'm working on a Smartphone / Tablet app, using only one APK, and loading resources as is needed dep...
异步执行–AsyncTask 在类的定义说明中有这样一句话 大概意思是你只能使用AsyncTask执行一些运行周期短的操作(最多只有几秒)如果是长周期的方法,最好使用Executor,ThreadPoolExecutor 等。...
Android 多线程:AsyncTask最详细使用教程 前言 多线程的应用在Android开发中是非常常见的,常用方法主要有: 继承Thread类 实现Runnable接口 Handler ...
Android: Progressdialog in AsyncTask Doe... I am starting the asynctask inside a SherlockListFragment which was created inside a Sherl...
Undo pre / post run in AsyncTask and call ... Is it mandatory to call super.onPreExecute when overriding onPreExecute in an AsyncTask? What does A...