AsyncTask

作者: 她做了一个梦 | 来源:发表于2018-05-02 15:39 被阅读2次

    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

          本文链接:https://www.haomeiwen.com/subject/xbgqrftx.html