内部封装了2个线程池+1个Handler(InternalHandler),1个线程池SerialExecutor任务排队,一个线程池THREAD_POOL_EXECUTOR执行任务。bash
public class MyTask extends AsyncTask<String, Double, Float> {
@Override // 子线程执行任务
protected Float doInBackground(String... strings) {
publishProgress(5D);
return 1f;
}
@Override // 准备执行doInBackground任务时回调
protected void onPreExecute() {
super.onPreExecute();
}
@Override // doInBackground任务执行结束后回调,接收的参数为doInBackground返回的值
protected void onPostExecute(Float aFloat) {
super.onPostExecute(aFloat);
}
@Override // doInBackground调用publishProgress会回调到该方法中
protected void onProgressUpdate(Double... values) {
super.onProgressUpdate(values);
}
@Override // 调用AsyncTask的任务关闭后回调
protected void onCancelled() {
super.onCancelled();
}
}
复制代码
public AsyncTask(@Nullable Looper callbackLooper) {
// 建立AsyncTask对象时,若不传外部的Handler实例,会走到这个构造中
// 拿到当前线程的Looper,传给new的Handler,则Handler在当前建立AsyncTask对象的线程中
// 所以,若要保证Handler执行环境在主线程,必需要在主线程中建立AsyncTask对象
mHandler = callbackLooper == null || callbackLooper == Looper.getMainLooper()
? getMainHandler()
: new Handler(callbackLooper);
......省略无关代码
}
复制代码
MyTask myTask = new MyTask();
// 默认在SerialExecutor线程池中串行执行
myTask.execute("1");
// 并行执行
myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "1");
复制代码
@MainThread // 主线程中执行的方法,默认选择SerialExecutor线程池串行执行任务
public final AsyncTask<Params, Progress, Result> execute(Params... params) {
return executeOnExecutor(sDefaultExecutor, params);
}
@MainThread // 主线程中执行的方法。外部也可直接调这个方法执行任务,本身传入线程池选择是串行仍是并行。
public final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec,
Params... params) {
// 一个AsyncTask对象,若屡次执行execute,走到这里,会判断任务在执行中或已结束时,都将抛异常
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;
}
复制代码