- 阅读代码系列的文章都是我阅读代码过程中记录下来的只言片语,读者可能需要对照着代码来看才能看懂。
如果对您要帮助我会非常的高兴!! - 看代码先了解这个段代码是如何用的非常重要,原因很简单,你只有知道熟知了它的用处,才能在看到它的实现时对此产生共鸣(难怪那样使用!!这样像是为了那样使用的!!原来是这样!!),如果要是以提问的形式写出来就更好了。
API-21
AsyncTask的使用
- 我们使用AsyncTask一般都是继承它,然后重新实现几个生命周期,然后实例化它并执行execute()
- onPreExecute() –> doInBackground()(新线程)–> onPostExecute()
- 当在doInBackground()里执行publishProgress()时在新线程里会调用onProgressUpdate
基本属性
- CPU_COUNT = Runtime.getRuntime().availableProcessors();
- CORE_POOL_SIZE, MAXIMUM_POOL_SIZE根据cpu数量算出 KEEP_ALIVE = 1
- ThreadFactory 使用了AtomicInteger计数线程个数,保证每个线程都有个唯一的名字
- BlockingQueue
待执行的任务队列 - ThreadPoolExecutor 并行的执行任务,用到了所有上面的东西来构造这个执行器
- SerialExecutor 串行执行器,对特定进程是唯一。 使用ArrayDeque
,在执行时先包装runnable保证执行完这个任务后再执行下一个,然后使用offer添加到队列结尾,最后如果没有正在运行的任务则运行任务。scheduleNext是从任务队列里取一个任务然后放到THREAD_POOL_EXECUTOR里执行。 - 两个消息:MESSAGE_POST_RESULT 和 MESSAGE_POST_PROGRESS
- InternalHandler 内部处理器,接受上面两个消息,做相应的处理。使用了AsyncTaskResult,封装了asynctask实例和数据
- sDefaultExecutor = SERIAL_EXECUTOR; volatile???它有什么用真心不太了解!!
- 以上全是静态的。类所拥有的
- 真正的工作者WorkerRunnable<Params, Result> mWorker;实现了Callable,包含参数数组返回结果。
- FutureTask
mFuture;?? - Status mStatus 状态
- enum Status: PENDING, RUNNING, FINISHED
- 两个原子变量:AtomicBoolean mCancelled, mTaskInvoked
构造函数
- 实现一个WorkerRunnable
a. mTaskInvoked.set(true); 标识task被调用,这是个原子操作
b. 设置优先级为后台
c. postResult(doInBackground(mParams)); postResult会从sHandle取得message并传给它数据,然后发送给handler - 实现一个FutureTask,在执行完成后postResultIfNotInvoked(get())?????
执行逻辑execute()
- execute → executeOnExecutor(使用默认的执行器) →
1. 如果状态不是pending而是正在执行或完成,则报错,一个task只能执行一次 2. 设置为正在执行然后调用onPreExecute(); 参数传给worker,执行器开始执行future。
- 调用了默认的执行器的execute,就是那个串行执行器(虽然每个task只能执行一次,但是这个执行器是属于累的,也就是说所有的task都会被放到一个执行器一个线程上执行)
- 如前所述,串行器会将任务放到一个队列上,并且从头取任务执行。它就是序列化任务,真正执行的是THREAD_POOL_EXECUTOR 是他开启了新线程,并行工作
- 这时候THREAD_POOL_EXECUTOR执行的是什么呢?
1. new Runnable() {r.run(); scheduleNext();} 2. r 就是传进来的 Future,构造函数里初始化的那个,构造它时传进了worker
publishProgress()报告进度
- 向handler发送Progress信息,并传递数据AsyncTaskResult
- handler是在主线程的,所以就可以直接调用主线程的onProgressUpdate
想看更多关注我的blog:http://jinguoliang.github.io
2020年评论:
都忘记了自己曾经写过这个,要复习呀,要重复呀,那时候,没有这种能力,现在有了点