您的位置:首页 > 移动开发 > Android开发

AsyncTask源码解析

2015-10-19 22:00 453 查看

1、AsyncTask的原理

主要是这三个方法:
(1)

   onPreExecute();在主线程中执行,在doInbackground方法之前

(2).

   result = doInbackground();在线程池中执行(子线程)

(3)

   onPostExecute();处理result,在主线程中执行(handler机制)

2、代码走向

AsyncTask的默认构造函数如下:

public AsyncTask() {
//实例化mWorker WorkerRunnable的代码看1步
//mWorker 是 Callable类型
mWorker = new WorkerRunnable<Params, Result>() {
public Result call() throws Exception {
。。。
}
};

// Future
mFuture = new FutureTask<Result>(mWorker) {
@Override
protected void done() {
。。。
}
};
}
//1步
private static abstract class WorkerRunnable<Params, Result> implements Callable<Result> {
Params[] mParams;
}

AsyncTask的 execute方法

public final AsyncTask<Params, Progress, Result> execute(Params... params) {

mStatus = Status.RUNNING;
//主线中调用onPreExecute
onPreExecute();

//mWorker Callable类型,把execute方法参数赋值给mWorker对象

mWorker.mParams = params;
// sExecutor 线程池
//mFuture
sExecutor.execute(mFuture);

return this;
}

FutureTask的构造函数

public FutureTask(Callable<V> callable) {
if (callable == null)
throw new NullPointerException();
//callable 就是 mWorker
sync = new Sync(callable);
}

Sync类的Callable参数构造函数:

//callable 还是 mWorker
Sync(Callable<V> callable) {
this.callable = callable;
}

FutureTask的run方法

public void run() {
sync.innerRun();
}

Sync类的innerRun方法

void innerRun() {
。。。。
V result;
try {
//子线程的执行结果
//1.mWorker.call
result = callable.call();//mworker
} catch (Throwable ex) {
setException(ex);
return;
}
//3.处理result
set(result);
} else {
releaseShared(0); // cancel
}
}
// 1. mWorker的 call方法
public Result call() throws Exception {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
//2.子线程执行
return doInBackground(mParams);
}

//4.set(result)保存result,FutureTask类的set方法:
protected void set(V v) {
//5. Sync里innerSet方法保存result
sync.innerSet(v);
}

//6.
//v  就是result
void innerSet(V v) {
for (;;) {
...
result = v;
//7. done
done();
return;

}
//8.done方法  在AsyncTask的构造函数中覆盖该方法,代码:
@Override
protected void done() {
Message message;
Result result = null;

try {
//9.get()
result = get();
}
// 10到12看下面 13.获取Message
message = sHandler.obtainMessage(MESSAGE_POST_RESULT,
new AsyncTaskResult<Result>(AsyncTask.this, result));
message.sendToTarget();
}
};
//14.InternalHandler的实现
private static class InternalHandler extends Handler {
@SuppressWarnings({"unchecked", "RawUseOfParameterizedType"})
//15.
@Override
public void handleMessage(Message msg) {
AsyncTaskResult result = (AsyncTaskResult) msg.obj;
switch (msg.what) {
case MESSAGE_POST_RESULT:
// There is only one result
//16.
result.mTask.finish(result.mData[0]);
break;
case MESSAGE_POST_PROGRESS:
result.mTask.onProgressUpdate(result.mData);
break;
case MESSAGE_POST_CANCEL:
result.mTask.onCancelled();
break;
}
}
}
// 17.
@SuppressWarnings({"RawUseOfParameterizedType"})
private static class AsyncTaskResult<Data> {
final AsyncTask mTask;
final Data[] mData;

AsyncTaskResult(AsyncTask task, Data... data) {
mTask = task;
mData = data;
}
}
// 18. AsyncTask类的finish()方法
private void finish(Result result) {
if (isCancelled()) result = null;
// 调用处理result,主线程
onPostExecute(result);
mStatus = Status.FINISHED;
}
//10.调用get()取结果
public V get() throws InterruptedException, ExecutionException {
//11.调用sync的innerGet方法
return sync.innerGet();
}
//12.sync.innerGet()
V innerGet() throws InterruptedException, ExecutionException {
//返回result,赋值的代码看6步
return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android 源码 asynctask