【源码】康一康过时的→AsyncTask(中)

简介: AsyncTask 对很多老Android来说,是一个很有年代感的东西了,想当年毕业找工作,AsyncTask可是面试必问。 随着 EventBus、RxJava、Kotlin协程 等的出现,它渐渐淡出了我们的视野,面试八股文也少了它的身影,很多新晋的Android开发估计都没听过它。不禁感叹:技术更新迭代真快,学不动了!面试不问,但一些老旧项目中还有用到它,接盘维护难免要学下,索性花一丢丢时间过一下:废弃原因 + 核心原理 + 演进历史。

往下看是**mFuture** 的实现:


网络异常,图片无法展示
|


任务包装类,添加了任务执行完后的回调,调用返回结果的处理方法,跟下:


网络异常,图片无法展示
|


最终调用的都是 postResult() 方法,利用 Handler 发送了一个标志位 MESSAGE_POST_RESULTMessage


往下走,跟下自定义Handler → InternalHandler 的具体实现细节:


网络异常,图片无法展示
|


重写 handleMessage() 对下述两种标记的Message进行处理:


  • MESSAGE_POST_RESULT → 任务结束;


  • MESSAGE_POST_PROGRESS → 任务进度更新;


任务进度更新那里,回调了 onProgressUpdate(),在跟下 finish()


网络异常,图片无法展示
|


判断任务取消标记是否为True,是回调 onCancelled(),否则回调 onPostExecute(),最后将AsyncTask状态字段设置为**FINISHED**。


② 多个任务的调度


跟下线程池 Executor,发现类中定义了 两个静态线程池 (实例共享),先看 THREAD_POOL_EXECUTOR


网络异常,图片无法展示
|


线城池配置:


核心池数(最少2,最多4)最大线程数(CPU数*2+1),非核心线程空闲存活时间(30s)、堵塞队列(LinkedBlockingQueue 堵塞链表队列,上限128,超出会抛异常)


再看另一个线程池 SERIAL_EXECUTOR


网络异常,图片无法展示
|


实现Executor接口,定义了一个 Runnable队列,在 初始化后一个任务执行结束后,都会从队列中获取 任务,并通过 THREAD_POOL_EXECUTOR 线程池执行。


线程池执行任务,而是把任务丢给另一个线程池完成,这是弄啥呢?


em...其实就是保证任务的 串行执行 (队列加同步锁),不想这样玩也也可以,开头这样写道:


网络异常,图片无法展示
|


调用下 executeOnExecutor(THREAD_POOL_EXECUTOR) 直接用 THREAD_POOL_EXECUTOR 线程池处理任务,就变成 并行执行 了。


以上就是Android 9.0中AsyncTask的实现原理,两个静态线程池,一个串行拿任务,丢到另一个线程池执行,非常简单。接着过下其他版本的AsyncTask的演进历史~


相关文章
idea切换java版本需要修改的几处地方
idea切换java版本需要修改的几处地方
|
Java Android开发
Java、Android 新建类自动添加头部注释以及如何添加函数注释模板和快捷键
Java、Android 新建类自动添加头部注释以及如何添加函数注释模板和快捷键
|
缓存 Java 应用服务中间件
Eclipse-无法执行现有代码,依旧执行以前的代码
Eclipse-无法执行现有代码,依旧执行以前的代码
522 0
|
机器学习/深度学习 人工智能 Oracle
劲爆!Java 18 正式发布,默认 UTF-8,finalize 被弃用。。别再乱用了!
劲爆!Java 18 正式发布,默认 UTF-8,finalize 被弃用。。别再乱用了!
142 0
劲爆!Java 18 正式发布,默认 UTF-8,finalize 被弃用。。别再乱用了!
|
Oracle 安全 Java
劲爆!Java 18 正式发布,默认 UTF-9,finalize 被弃用。。别再乱用了!(2)
劲爆!Java 18 正式发布,默认 UTF-9,finalize 被弃用。。别再乱用了!(2)
141 0
劲爆!Java 18 正式发布,默认 UTF-9,finalize 被弃用。。别再乱用了!(2)
|
Java API Android开发
【源码】康一康过时的→AsyncTask(上)
AsyncTask 对很多老Android来说,是一个很有年代感的东西了,想当年毕业找工作,AsyncTask可是面试必问。 随着 EventBus、RxJava、Kotlin协程 等的出现,它渐渐淡出了我们的视野,面试八股文也少了它的身影,很多新晋的Android开发估计都没听过它。不禁感叹:技术更新迭代真快,学不动了!面试不问,但一些老旧项目中还有用到它,接盘维护难免要学下,索性花一丢丢时间过一下:废弃原因 + 核心原理 + 演进历史。
292 0
|
Java Android开发 Kotlin
【源码】康一康过时的→AsyncTask(下)
AsyncTask 对很多老Android来说,是一个很有年代感的东西了,想当年毕业找工作,AsyncTask可是面试必问。 随着 EventBus、RxJava、Kotlin协程 等的出现,它渐渐淡出了我们的视野,面试八股文也少了它的身影,很多新晋的Android开发估计都没听过它。不禁感叹:技术更新迭代真快,学不动了!面试不问,但一些老旧项目中还有用到它,接盘维护难免要学下,索性花一丢丢时间过一下:废弃原因 + 核心原理 + 演进历史。
191 0
|
Android开发
Android项目实战(十一):moveTaskToBack(boolean ) 方法的使用
原文:Android项目实战(十一):moveTaskToBack(boolean ) 方法的使用 当你开发的程序被按后退键退出的时候, 你肯定不想让他就这么被finish()吧,那么就想把程序退置到后台就可。
1118 0
|
Java 程序员
Java NIO.2版中的异步IO的两种主要调用形式:将来式和回调式
这要注意应用场合的区别, 是有异常就及时中止,还是等主进程拿结果。 《Java程序员修炼之道》此书长功力啊!
1556 0
|
Android开发
Android应用开发—setResult()的调用时机
本文转载自setResult()的调用时机,此处做了重新的排版,只是感觉markdown的排版比较好看些,侵删。 今天遇到这样一个问题,我在Activity-A中用startActivityForResult()方法启动了Activity-B,并且在B中通过setResult()方法给A返回值,由于某些原因不能在setResult()之后立刻调用finish()函数,只能通过用户按Back键自己退出到A。
1661 0