asynctask源码解析


1. AsyncTask源码

我们先看执行异步任务的入口execute方法

1
2
3
4
5
6
7
8
9
10
11
12
13
public final AsyncTask<Params, Progress, Result> (Params... params) {
return executeOnExecutor(sDefaultExecutor, params);
}

public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec,
Params... params)
{

...
mStatus = Status.RUNNING;
onPreExecute();
mWorker.mParams = params;
exec.execute(mFuture);
return this;
}

在executeOnExecutor中,先执行了onPreExecute方法,然后将params传给mWorker对象,并且执行exec.execute(mFuture)方法。接下来我们看mWorker和mFuture。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mWorker = new WorkerRunnable<Params, Result>() {
public Result call() throws Exception {
mTaskInvoked.set(true);

Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);

Result result = doInBackground(mParams);
Binder.flushPendingCommands();
return postResult(result);
}
};

mFuture = new FutureTask<Result>(mWorker) {

protected void done() {
postResultIfNotInvoked(get());
}
};

mFuture包装了mWorker对象,在这个mFuture对象的run函数中又会调用mWorker对象的call方法,在call方法中又调用了doInBackground函数。