Android开发:异步任务AsyncTask源码解析
上篇文章我们讲解了AsyncTask的源码:我们知道AsyncTask默认是串行执行异步任务,线程池是一个一个的处理任务,处理完后再从任务队列拿。但是在多线程并发下这样做显然效率太慢了。
565 @MainThread
566 public final AsyncTask<Params, Progress, Result> execute(Params... params) {
567 return executeOnExecutor(sDefaultExecutor, params);
568 }
603 @MainThread
604 public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec,
605 Params... params) {
606 if (mStatus != Status.PENDING) {
//抛出异常
607 switch (mStatus) {
608 case RUNNING:
609 throw new IllegalStateException("Cannot execute task:"
610 + " the task is already running.");
611 case FINISHED:
612 throw new IllegalStateException("Cannot execute task:"
613 + " the task has already been executed "
614 + "(a task can be executed only once)");
615 }
616 }
617
618 mStatus = Status.RUNNING;
619
//调用onPreExecute
620 onPreExecute();
621
622 mWorker.mParams = params;
//将线程任务加入队列
623 exec.execute(mFuture);
624
625 return this;
626 }
execute()
调用executeOnExecutor()
方法传入sDefaultExecutor
对象,然后调用exec.execute(mFuture)
,sDefaultExecutor
是AsyncTask
的内部类SerialExecutor
的实例。SerialExecutor
内部维护了一个任务队列,线程池从任务队列取任务执行,从而来实现任务串行执行。从源码来看,只要我们去掉SerialExecutor
这个步骤就可以实现异步任务并行:
所以直接调用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,params)
就可以直接把任务放入到AsyncTask
默认的线程池中,这样子就可以串行执行。当然你也可以传入自己的线程池。