【源码】康一康过时的→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的演进历史~


相关文章
|
6月前
|
Java Android开发
Android系统 获取用户最后操作时间回调实现和原理分析
Android系统 获取用户最后操作时间回调实现和原理分析
184 0
|
Java API Android开发
【源码】康一康过时的→AsyncTask(上)
AsyncTask 对很多老Android来说,是一个很有年代感的东西了,想当年毕业找工作,AsyncTask可是面试必问。 随着 EventBus、RxJava、Kotlin协程 等的出现,它渐渐淡出了我们的视野,面试八股文也少了它的身影,很多新晋的Android开发估计都没听过它。不禁感叹:技术更新迭代真快,学不动了!面试不问,但一些老旧项目中还有用到它,接盘维护难免要学下,索性花一丢丢时间过一下:废弃原因 + 核心原理 + 演进历史。
289 0
|
Java Android开发 Kotlin
【源码】康一康过时的→AsyncTask(下)
AsyncTask 对很多老Android来说,是一个很有年代感的东西了,想当年毕业找工作,AsyncTask可是面试必问。 随着 EventBus、RxJava、Kotlin协程 等的出现,它渐渐淡出了我们的视野,面试八股文也少了它的身影,很多新晋的Android开发估计都没听过它。不禁感叹:技术更新迭代真快,学不动了!面试不问,但一些老旧项目中还有用到它,接盘维护难免要学下,索性花一丢丢时间过一下:废弃原因 + 核心原理 + 演进历史。
189 0
|
安全 Android开发
【Android 逆向】ART 函数抽取加壳 ( ART 下的函数抽取恢复时机 | 禁用 dex2oat 机制源码分析 )(一)
【Android 逆向】ART 函数抽取加壳 ( ART 下的函数抽取恢复时机 | 禁用 dex2oat 机制源码分析 )(一)
446 0
|
Android开发
【Android 逆向】ART 函数抽取加壳 ( ART 下的函数抽取恢复时机 | 禁用 dex2oat 机制源码分析 )(二)
【Android 逆向】ART 函数抽取加壳 ( ART 下的函数抽取恢复时机 | 禁用 dex2oat 机制源码分析 )(二)
341 0
|
安全 Java Android开发
【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | BaseDexClassLoader 构造函数 | DexPathList 构造函数及后续调用 )
【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | BaseDexClassLoader 构造函数 | DexPathList 构造函数及后续调用 )
255 0
|
Ubuntu Linux 开发工具
Android系统源码学习步骤
  Android系统是基于Linux内核来开发的,在分析它在运行时库层的源代码时,我们会经常碰到诸如管道(pipe)、套接字(socket)和虚拟文件系统(VFS)等知识。   此外,Android系统还在Linux内核中增加了一些专用的驱动程序,例如用于日志系统的Logger驱动程序、用于进程间通信的Binder驱动程序和用于辅助内存管理的匿名共享内存Ashmem驱动程序。
1393 0
|
Android开发
Android项目实战(十一):moveTaskToBack(boolean ) 方法的使用
原文:Android项目实战(十一):moveTaskToBack(boolean ) 方法的使用 当你开发的程序被按后退键退出的时候, 你肯定不想让他就这么被finish()吧,那么就想把程序退置到后台就可。
1116 0
|
Android开发
Android应用开发—setResult()的调用时机
本文转载自setResult()的调用时机,此处做了重新的排版,只是感觉markdown的排版比较好看些,侵删。 今天遇到这样一个问题,我在Activity-A中用startActivityForResult()方法启动了Activity-B,并且在B中通过setResult()方法给A返回值,由于某些原因不能在setResult()之后立刻调用finish()函数,只能通过用户按Back键自己退出到A。
1656 0