Android开发:AsyncTask源码解析
Android开发:AsyncTask源码解析
关于AsyncTask的使用可以参看Android sdk提供的AsyncTask相关文档,本文来解析AsyncTask的源代码。
我们只需要调用AsyncTask的execute方法,因此我们也将从这里开始。
- public final AsyncTask<Params, Progress, Result> execute(Params... params) {
- if (mStatus != Status.PENDING) {//Status有PENDING(未执行),RUNNING(正在执行),FINISHED(已完成)三个状态,如果mStatus不为PENDING,则抛出异常
- switch (mStatus) {
- case RUNNING:
- throw new IllegalStateException("Cannot execute task:"
- + " the task is already running.");
- case FINISHED:
- throw new IllegalStateException("Cannot execute task:"
- + " the task has already been executed "
- + "(a task can be executed only once)");
- }
- }
- mStatus = Status.RUNNING;//从PENDING状态转为RUNNING,所以当AsyncTask只能调用一次execute,第二次调用时mStatus为RUNNING就会抛出异常
- onPreExecute();//由UI线程在执行doInBackground方法之前执行
- mWorker.mParams = params;//mWorker为WorkerRunnable类型,WorkerRunnable是AsyncTask的一个抽象静态内部类,该类继承了Callable接口,并且拥有Params[] mParams做为其成员
- sExecutor.execute(mFuture);//mFuture为FutureTask类型,该类实现Future<V>, Runnable接口,sExecutor是一个ThreadPoolExecutor类型
- return this;
- }
- public void execute(Runnable command) {
- ......
- int c = ctl.get();
- if (workerCountOf(c) < corePoolSize) {
- if (addWorker(command, true))
- return;
- c = ctl.get();
- }
- ......
- }
- private boolean addWorker(Runnable firstTask, boolean core) {
- .....
- Worker w = new Worker(firstTask);
- Thread t = w.thread;
- final ReentrantLock mainLock = this.mainLock;//获得线程锁
- mainLock.lock();//锁住线程
- try {
- int c = ctl.get();
- int rs = runStateOf(c);
- if (t == null ||
- (rs >= SHUTDOWN &&
- ! (rs == SHUTDOWN &&
- firstTask == null))) {
- decrementWorkerCount();
- tryTerminate();
- return false;
- }
- workers.add(w);//放入工作队列
- int s = workers.size();
- if (s > largestPoolSize)
- largestPoolSize = s;
- } finally {
- mainLock.unlock();//开锁
- }
- t.start();//执行线程,关键
- ...
- return true;
- }
- 到此我们知道AsyncTask的execute的执行流程为
- 先调用ThreadPoolExecutor.execute(mFuture);
- 然后ThreadPoolExecutor.execute(mFuture) 会调用ThreadPoolExecutor.addWorker(mFuture);
- 最后ThreadPoolExecutor.addWorker(mFuture)会调用mFuture的run()方法,run方法中就是该线程要执行操作的地方
- 到此我们来关注一下mFuture,AsyncTask中的mFuture是一个FutureTask,FutureTask实现了Future<V>, Runnable两个接口,
- Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果,计算完成后只能使用 get 方法来获取结果。
- mFuture以mWorker作为参数
- mFuture = new FutureTask<Result>(mWorker) {
- 。。。。
- }
用到了FutureTask的一个构造函数
- public FutureTask(Callable<V> callable) {
- if (callable == null)
- throw new NullPointerException();
- sync = new Sync(callable);
- }
- private final class Sync extends AbstractQueuedSynchronizer{
- ...
- }
- private static abstract class WorkerRunnable<Params, Result> implements Callable<Result> {
- Params[] mParams;
- }
- public void run() {
- sync.innerRun();
- }
- void innerRun() {
- ...
- runner = Thread.currentThread();
- if (getState() == RUNNING) { // recheck after setting thread
- V result;
- try {
- result = callable.call();//调用callable的call方法并返回值,此时的callable为mWorker
- } catch (Throwable ex) {
- setException(ex);
- return;
- }
- set(result);//设置结果
- } else {
- releaseShared(0); // cancel
- }
- }
- mWorker = new WorkerRunnable<Params, Result>() {
- public Result call() throws Exception {
- Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
- return doInBackground(mParams);
- }
- };
|
评论暂时关闭