AsyncTask

AsyncTask是一个异步任务类,它的内部封装了Hanlder和线程池,当使用无参数的构造方法时,Handler使用InternalHandler,运行在主线程。可以使用构造方法,public AsyncTask(@Nullable Looper callbackLooper) 让Handler运行在子线程。AsyncTask为 UI 线程与工作线程之间进行快速的切换提供一种简单便捷的机制。适用于当下立即需要启动,但是异步执行的生命周期短暂的使用场景。

异步任务由3种泛型定义,Params(参数),Progress(进度),Result(结果)。

包含四个步骤,onPreExecute(任务执行前调用),doInBackground(执行后台任务),onProgressUpdate(更新进度),onPostExecute(任务执行完之后调用,运行在UI线程)。


调用execute方法可以开启一个任务。

public final AsyncTask execute(Params... params) {

return executeOnExecutor(sDefaultExecutor, params);

}


在executeOnExecutor方法里,首先调用onPreExecute方法,然后将参数赋值给mWorker(WorkerRunnable实现类).

mWorker.mParams = params;

调用SerialExecutor的execute(mFuture)方法,开始执行后台任务。

private static class SerialExecutorimplements Executor {

final ArrayDequemTasks =new ArrayDeque();

RunnablemActive;

public synchronized void execute(final Runnable r) {

mTasks.offer(new Runnable() {

public void run() {

try {

r.run();//执行FutureTask的run方法。run方法中执行Callable的call方法。

}finally {

scheduleNext();线性调度执行,本次任务完成之后,再执行下一个任务。

}

}

});

if (mActive ==null) {

scheduleNext();

}

}

protected synchronized void scheduleNext() {

if ((mActive =mTasks.poll()) !=null) {

THREAD_POOL_EXECUTOR.execute(mActive);

}

}

}

AsyncTask构造方法里,初始化了WorkerRunnable,WorkerRunnable实现了Callable接口,在call()方法中doInBackground()方法,执行后台操作,执行完之后,调用postResult方法,这个方法通过Handler发送消息,将线程切换到UI线程。在AsyncTask的finish方法里调用onPostExecute方法。

你可能感兴趣的:(AsyncTask)