AsyncTask
2018-09-29 10:47:19 2 举报
AsyncTask启动和后台流程
作者其他创作
大纲/内容
通过特定字段MESSAGE_POST_RESULT调用了AsyncTask.finish,并把result传入
上一个方法中将mFuture传入,在这个方法中将mFuture包装进一个Runnable钟,并通过ThreadPoolExecutor启动这个executor。至此另一个线程启动了,也调用mFuture的run方法
当线程结束后经过一系列方法最后调用到该函数
ThreadPoolExecutor在静态块创建,主要有三个参数:1.corePoolSize核心线程数量2.maximumPoolSize最大线程数量3.keepAliveTime当线程数量大于核心线程的时候空闲线程保留的时间要启动ThreadPoolExecutor需要调用executor,该方法的工作方式如下: 如果线程池的线程数量小于核心线程数量则新建线程 如果线程池的数量大于核心线程数量且小于最大线程数量: ·如果工作队列未满,则将线程放入工作队列中等待 ·如果工作队列已满,则直接开一个新的线程 如果线程池的数量大于最大线程数量 ·工作队列处于未满状态则放入 ·工作队列已满则拒绝
FutureTask.run
FutureTask是一个Runnable,并且将WorkerRunnable传入FutureTask。
WorkerRunnable是一个实现了Callable接口的抽象类,他只有一个传入参数的数组Params[]
将传入的线程返回的值包装到一个AsyncTaskResult中,并将AsyncTaskResult传入新创建的Message中。后面通过特定字段MESSAGE_POST_RESULT让Handler判断
AsyncTask.execute
FutureTask.done
这是对外的execute方法,方法内将参数传入并放到mWorker的mParams变量中,sExecutor是一个SerialExecutor,该类定义了executor方法。在该方法内执行execute方法。
AsyncTask.finish
该方法就调用了对外的doInBackground方法,
方法主要调用WorkerRunnable的call方法。
AsyncTask.AsyncTask
WorkerRunnable.call
SerialExecutor.execute
WorkerRunnable
FutureTask
AsyncTask.InternalHandler.handleMessage
判断当前线程是否是cancel才调用finish的。如果是调用外部方法onCancelled,否则调用onPostExecute
AsyncTask.postResult
1.先判断有没有传入Looper,如果没有的话那么默认在主线程中得到Looper,并创建一个主线程的Handler放入成员变量mHandler中,这个Handler为继承了Handler的InternalHandler,并重写了handleMessage2.创建了WorkerRunnable和FutureTask,并实现了WorkerRunnable的call方法和FutureTask的done方法
LinkedBlockingQueue是一个支持Runnable的工作队列,他的逻辑是1.如果从空的LinkedBlockingQueue中取出一个工作任务来,那么他会被堵塞,直到有新的任务添加进来2.如果向满的LinkedBlockingQueue添加新的任务,那么他会堵塞,直到他有新的空间为止
0 条评论
下一页