源码篇——AsyncTask机制

AsyncTask

new AsyncTask<String,String,String>(){
    // 运行在主线程中,做预备工作
    onPreExecute(){

    }
    // 运行在子线程中,做耗时操作
    String doingBackGround(String s){

    }
    // 运行在主线程中,耗时操作完成,更新UI
    onPostExecute(String s){

    }

}.execute(String);

AsyncTask的execute方法

public final AsyncTask<Params, Progress, Result> execute(Params... params) {
        ...

        mStatus = Status.RUNNING;
        // 在主线程中执行准备操作
        onPreExecute();
        // 把params参数赋值给mWorker
        mWorker.mParams = params;
        // 用线程池执行mFuture
        sExecutor.execute(mFuture);

// 在AsyncTask构造方法中创建了mWorker
    mWorker = new WorkerRunnable<Params, Result>() {
        public Result call() throws Exception {
           ...
        }
    };

    mFuture = new FutureTask<Result>(mWorker) {
        @Override
        protected void done() {
            ...
        }
    };
}
    // 把mWorker传递给FutureTask,callable指的就是mWorker
    public FutureTask(Callable<V> callable) {
            if (callable == null)
                throw new NullPointerException();
            sync = new Sync(callable);
        }
    // 把mWorker传递给Sync,callable指的是mWorker
    Sync(Callable<V> callable) {
                this.callable = callable;
            }

线程池执行FutureTask,就是执行FutureTask的run方法,代码如下:

    public void run() {
            // 转调
            sync.innerRun();
        }

    void innerRun() {
                if (!compareAndSetState(READY, RUNNING))
                    return;

                runner = Thread.currentThread();
                if (getState() == RUNNING) { // recheck after setting thread
                    V result;
                    try {
                        // 就是调用了mWorker.call方法
                        // 把耗时操作得到的结果赋值给result
                        result = callable.call();
                    } catch (Throwable ex) {
                        setException(ex);
                        return;
                    }
                    // 转调了sync.innerSet(v);
                    set(result);
                } else {
                    releaseShared(0); // cancel
                }
            }

    mWorker = new WorkerRunnable<Params, Result>() {
                public Result call() throws Exception {
                    Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
                    // 执行耗时操作 在子线程中执行
                    return doInBackground(mParams);
                }
            };

    protected void set(V v) {
            // 转调
            sync.innerSet(v);
        }

    void innerSet(V v) {
                for (;;) {
                    int s = getState();
                    if (s == RAN)
                        return;
                    if (s == CANCELLED) {
                        // aggressively release to set runner to null,
                        // in case we are racing with a cancel request
                        // that will try to interrupt runner
                        releaseShared(0);
                        return;
                    }
                    if (compareAndSetState(s, RAN)) {
                        result = v;
                        releaseShared(0);
                        // 调用了FutureTask的抽象方法
                        done();
                        return;
                    }
                }
            }

    mFuture = new FutureTask<Result>(mWorker) {
        @Override
        protected void done() {
            Message message;
            Result result = null;

            try {
                // 转调了sync.innerGet()
                result = get();
            } catch (InterruptedException e) {
                android.util.Log.w(LOG_TAG, e);
            } catch (ExecutionException e) {
                throw new RuntimeException("An error occured while executing doInBackground()",
                        e.getCause());
            } catch (CancellationException e) {
                message = sHandler.obtainMessage(MESSAGE_POST_CANCEL,
                        new AsyncTaskResult<Result>(AsyncTask.this, (Result[]) null));
                message.sendToTarget();
                return;
            } catch (Throwable t) {
                throw new RuntimeException("An error occured while executing "
                        + "doInBackground()", t);
            }
            // 发送了一个Message
            message = sHandler.obtainMessage(MESSAGE_POST_RESULT,
                    new AsyncTaskResult<Result>(AsyncTask.this, result));
            message.sendToTarget();
        }
    };

    public V get() throws InterruptedException, ExecutionException {
            // 转调
            return sync.innerGet();
        }

    V innerGet() throws InterruptedException, ExecutionException {
                acquireSharedInterruptibly(0);
                if (getState() == CANCELLED)
                    throw new CancellationException();
                if (exception != null)
                    throw new ExecutionException(exception);
                // 把之前doinBackground方法的结果返回
                return result;
            }

在AsyncTask的成员变量,创建了InternalHandler

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
                // 结束耗时操作完成后的消息
                // 调用了AsyncTask的finish方法传递的result.mData[0]就是之前
                // 耗时操作返回来的结果
                result.mTask.finish(result.mData[0]);
                break;
            case MESSAGE_POST_PROGRESS:
                result.mTask.onProgressUpdate(result.mData);
                break;
            case MESSAGE_POST_CANCEL:
                result.mTask.onCancelled();
                break;
        }
    }
}
private static class AsyncTaskResult<Data> {
    final AsyncTask mTask;
    final Data[] mData;
    // data 是返回的结果
    AsyncTaskResult(AsyncTask task, Data... data) {
        mTask = task;
        mData = data;
    }
}

private void finish(Result result) {
    if (isCancelled()) result = null;
    // 耗时操作完成,更新UI,执行在主线程
    onPostExecute(result);
    mStatus = Status.FINISHED;
}
时间: 2024-08-22 15:13:49

源码篇——AsyncTask机制的相关文章

深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)

深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇) 上篇文章<深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)>我们通过对mybatis源码的简单分析,可看出,在mybatis配置文件中,在configuration根节点下面,可配置properties.typeAliases.plugins.objectFactory.objectWrapperFactory.settings.environments

深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)

深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇) 上篇文章<深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)> 介绍了properties与environments, 本篇继续讲剩下的配置节点之一:typeAliases. typeAliases节点主要用来设置别名,其实这是挺好用的一个功能, 通过配置别名,我们不用再指定完整的包名,并且还能取别名. 例如: 我们在使用 co

深入浅出Mybatis系列(二)---配置简介(mybatis源码篇)

深入浅出Mybatis系列(二)---配置简介(mybatis源码篇) 上篇文章<深入浅出Mybatis系列(一)---Mybatis入门>, 写了一个Demo简单体现了一下Mybatis的流程.本次,将简单介绍一下Mybatis的配置文件: 上次例子中,我们以 SqlSessionFactoryBuilder 去创建 SqlSessionFactory,  那么,我们就先从SqlSessionFactoryBuilder入手, 咱们先看看源码是怎么实现的: SqlSessionFactory

Android源码分析-Alarm机制与Binder的交互

转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/18448997 前言 本次给大家分析的是Android中Alarm的机制以及它和Binder的交互,所用源码为最新的Android4.4.因为Alarm的功能都是通过Binder来完成的,所以,介绍Alarm之前必须要先介绍下它是如何调用Binder来完成定时功能的.由于内容较多,本文会比较长,在文章结构安排上是这样的:首先简单介绍如何使用Alarm并给出其工作原理,接着分析

MySQL Master High Available 源码篇

MasterFailover (Non-GTID) MHA::MasterFailover::main()->do_master_failover Phase 1: Configuration Check Phase init_config(): 初始化配置 MHA::ServerManager::init_binlog_server: 初始化binlog server check_settings() a. check_node_version(): 查看MHA的版本 b. connect_a

activiti 动态配置 activiti 监听引擎启动和初始化(高级源码篇)

1.1.1. 前言 用户故事:现在有这样一个需求,第一个需求:公司的开发环境,测试环境以及线上环境,我们使用的数据库是不一样的,我们必须能够任意的切换数据库进行测试和发布,对数据库连接字符串我们需要加密,保证我们的数据库连接不能被发现.必须确保我们的数据库不能暴露出去,第二个需求,我们需要监控activiti 工作流引擎,在流程启动的之前,我们要保证我们的所有属性都注入进去,如果有些属性没有注入进去,我们是不能让流程启动起来的.也就是进行必要饿属性检测,如果没有期望的属性,直接报错,在流程实例化

源码篇——Handler消息机制

Handler消息机制 Message 消息 Message.obtain() Message msg = new Message() Handler new Handler(){ handlerMessage(Message msg){ // 处理消息 } } Handler的构造方法: public Handler() { ... // 获取looper mLooper = Looper.myLooper(); if (mLooper == null) { throw new Runtime

PgSQL · 源码分析 · AutoVacuum机制之autovacuum launcher

背景 根据之前月报的分析,PostgreSQL中的MVCC机制(详见月报)同时存储新旧版本的元组,对于经常更新的表来说,会造成表膨胀的情况.为了解决这个问题,PostgreSQL 引入了VACUUM和ANALYZE命令,并且引入了AutoVacuum自动清理. 在PostgreSQL中,AutoVacuum自动清理操作包括: 删除或重用无效元组的磁盘空间 更新数据统计信息,保证执行计划更优 更新visibility map,加速index-only scans (详见文档) 避免XID 回卷造成

源码篇——安卓启动流程

首先说到的是安卓的四层架构:  APPLICTION, APPLICATION FRAMEWORK, LIBRARICB+ANDROID RUNTIME, LINUX KERNEL android启动 当引导程序启动Linux内核后,会加载各种驱动和数据结构,当有了驱动以后,开始启动Android系统同时会加载用户级别的第一个进程init(system\core\init.c)代码如下: int main(int argc, char **argv) { // 创建文件夹 挂载 mount("t