Android源码解读 第二篇
来源:互联网 发布:windows iso怎么安装 编辑:程序博客网 时间:2024/06/05 08:48
今天我们来学习一下AsyncTask的源码。
首先让我们看一下AsyncTask类的入口,即execute(Params... params)方法:
public final AsyncTask<Params, Progress, Result> execute(Params... params) {
return executeOnExecutor(sDefaultExecutor, params);
}
public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec,
Params... params) {
if (mStatus != Status.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;
onPreExecute();
mWorker.mParams = params;
exec.execute(mFuture);
return this;
}
根据代码可以看出 AsyncTask在执行 onPreExecute();方法前先判断了一下此类的运行状态,由此确保AsyncTask的execute()方法只被调用一次,在此方法中 改变了AsyncTask的运行状态,调用了自身的onPreExecute();方法,由此可得出onPreExecute()方法在doInBackground方法之前执行。
接下来看一下mWorker对象
private static abstract class WorkerRunnable<Params, Result> implements Callable<Result> {
Params[] mParams;
}
public AsyncTask() {
mWorker = new WorkerRunnable<Params, Result>() {
public Result call() throws Exception {
mTaskInvoked.set(true);
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
//noinspection unchecked
return postResult(doInBackground(mParams));
}
};
}
mWorker为WorkerRunnable类型,WorkerRunnable是AsyncTask的一个抽象静态内部类,该类继承了Callable接口,并且拥有Params[] mParams做为其成员 mWorker对象在AsycnTask的构造函数中被实例化。
当执行exec.execute(mFuture)时,调用了ThreadPoolExecutor中的execute方法,该方法使用一个Runnable作为参数,如下:
public interface Executor {
void execute(Runnable command);
}
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
int c = ctl.get();
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true))
return;
c = ctl.get();
}
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
if (! isRunning(recheck) && remove(command))
reject(command);
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
else if (!addWorker(command, false))
reject(command);
}
其中addWorker(command, true)方法将Runnable放到工作队列中,并执行次Runnable。如下:
private boolean addWorker(Runnable firstTask, boolean core) {
retry:
for (;;) {
int c = ctl.get();
int rs = runStateOf(c);
if (rs >= SHUTDOWN &&
! (rs == SHUTDOWN &&
firstTask == null &&
! workQueue.isEmpty()))
return false;
for (;;) {
int wc = workerCountOf(c);
if (wc >= CAPACITY ||
wc >= (core ? corePoolSize : maximumPoolSize))
return false;
if (compareAndIncrementWorkerCount(c))
break retry;
c = ctl.get(); // Re-read ctl
if (runStateOf(c) != rs)
continue retry;
}
}
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();
if (runStateOf(ctl.get()) == STOP && ! t.isInterrupted())
t.interrupt();
return true;
}
以上就是asyncTask的执行流程,接下来让我们看一下 它内在的数据传递吧
private static class InternalHandler extends Handler {
@SuppressWarnings({"unchecked", "RawUseOfParameterizedType"})
@Override
public void handleMessage(Message msg) {
AsyncTaskResult result = (AsyncTaskResult) msg.obj;
switch (msg.what) {
case MESSAGE_POST_RESULT:
// There is only one result
result.mTask.finish(result.mData[0]);
break;
case MESSAGE_POST_PROGRESS:
result.mTask.onProgressUpdate(result.mData);
break;
}
}
}
private Result postResult(Result result) {
@SuppressWarnings("unchecked")
Message message = sHandler.obtainMessage(MESSAGE_POST_RESULT,
new AsyncTaskResult<Result>(this, result));
message.sendToTarget();
return result;
}
protected final void publishProgress(Progress... values) {
if (!isCancelled()) {
sHandler.obtainMessage(MESSAGE_POST_PROGRESS,
new AsyncTaskResult<Progress>(this, values)).sendToTarget();
}
}
由此可以看出 AsyncTask内部是使用handler 进行传值的。
- Android源码解读 第二篇
- lsd-slam源码解读第二篇:DataStructures
- 第二篇--下载Android源码
- calabash-android源码解读
- Android SQLiteOpenHelper源码解读
- Android IntentService源码解读
- Android Volley 源码解读
- android AsyncTask 源码解读
- Bootstrap源码解读(第二弹:表单)
- Android图片浏览源码解读
- android Handler & Looper 源码解读
- android 普通蓝牙源码解读
- Android分享功能源码解读
- android View的源码解读
- 第二篇、vlc-android之源码介绍
- Android源码解读 第一篇 初识源码
- packageInstalled函数的第二个参数returnCode的源码解读
- ACE框架解读 - 源码篇
- android 集成第三方静态库的编译方法
- libsvm-javaAPI
- 为什么封装的dll看不到注释
- linux获取前一天的日期的脚本
- iOS开发遇到问题汇总(一)
- Android源码解读 第二篇
- Chrome浏览器自动将ajax请求回来的json数据排序问题
- 写一个数组,实现初始化,逆序,清空,显示。
- 反调试学习
- 没有防毒软件的iOS,还安全么?
- Dispatcher initialization failed
- GCD
- activity四种启动模式
- Android adb命令修改配置或属性 adb发送广播