zoukankan      html  css  js  c++  java
  • AsyncTask的原理分析

    先看一张流程图

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public () {

    mWorker = new WorkerRunnable<Params, Result>() {
    public Result call() throws Exception {
    mTaskInvoked.set(true);
    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
    //noinspection unchecked
    //后台执行任务
    Result result = doInBackground(mParams);
    Binder.flushPendingCommands();
    //postResult方法中会使用Handler把执行结果抛到主线程
    return postResult(result);
    }
    };
    //把上述执行体mWorker传进来
    mFuture = new FutureTask<Result>(mWorker) {
    protected void done() {
    postResultIfNotInvoked(get());
    }
    };
    }

    这就是new AsyncTask()所做的操作,可以想到肯定有一个地方执行了mFeture,然后调用了call方法回到WorkRunnable中开始任务的执行。

    1
    2
    public static final Executor SERIAL_EXECUTOR = new SerialExecutor();
    private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    private static class SerialExecutor implements Executor {
    final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();
    Runnable mActive;
    //右下边的分析可以知道,这里的 r 就是mFuture实例
    public synchronized void execute(final Runnable r) {
    mTasks.offer(new Runnable() {
    大专栏  AsyncTask的原理分析pan class="comment">//mActive的run方法
    public void run() {
    try {
    //线程会走到这里执行真正的执行体,也就是mFuture的run方法
    //mFuture是一个FutureTask类型,在执行Task的run时会调用call方法
    //result = c.call()这个c就是上述的mWorker实例
    r.run();
    } finally {
    scheduleNext();
    }
    }
    });
    if (mActive == null) {
    scheduleNext();
    }
    }

    protected synchronized void scheduleNext() {
    //执行体出队-把上述的mTasks.offer的那个Runnable赋值为mActive
    if ((mActive = mTasks.poll()) != null) {
    //直到这里才开始真正执行任务,会执行mActive的run方法
    THREAD_POOL_EXECUTOR.execute(mActive);
    }
    }
    }
    1
    2
    3
    4
    public final AsyncTask<Params, Progress, Result> execute(Params... params) {
    //
    return executeOnExecutor(sDefaultExecutor, params);
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    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就是sDefaultExecutor,这里执行sDefaultExecutor也就是SerialExecutor的execute方法
    * mFeture就是在构造方法里边初始化的那个FutureTask实例
    */
    exec.execute(mFuture);
    return this;
    }
  • 相关阅读:
    spin lock自旋锁 双链表操作(多线程安全)(Ring0)
    Interlocked单向链式栈
    自旋锁(Spin Lock)
    可等待定时器(获取系统时间)
    APC注入(Ring3)
    IOCP IO完成端口
    异步设备IO OVERLAPPED结构(设备内核对象 事件内核对象 可提醒IO)
    读写锁 SRWLOCK
    shell查看进程
    linux dmesg命令
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12401745.html
Copyright © 2011-2022 走看看