往下看是**mFuture
** 的实现:
任务包装类,添加了任务执行完后的回调,调用返回结果的处理方法,跟下:
最终调用的都是 postResult()
方法,利用 Handler
发送了一个标志位 MESSAGE_POST_RESULT
的 Message
。
往下走,跟下自定义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的演进历史~