android开发:AsyncTask实现并发执行异步任务

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)sDefaultExecutorAsyncTask的内部类SerialExecutor的实例。SerialExecutor内部维护了一个任务队列,线程池从任务队列取任务执行,从而来实现任务串行执行。从源码来看,只要我们去掉SerialExecutor这个步骤就可以实现异步任务并行:
所以直接调用executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,params)就可以直接把任务放入到AsyncTask默认的线程池中,这样子就可以串行执行。当然你也可以传入自己的线程池。

发布了194 篇原创文章 · 获赞 42 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_39027256/article/details/103583010
今日推荐