`
king_tt
  • 浏览: 2108349 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android AsyncTask源码分析

 
阅读更多

尊重原创作者,转载请注明出处:

http://blog.csdn.net/gemmem/article/details/8957111

AsyncTask是一个抽象类,我们需要继承这个类,并实现抽象方法,在这个类的实现过程中需要定义3个类和执行4个方法。3个类分别是:

1.Params:执行异步任务需要的参数

2.Progress:异步任务后台执行中需要刷新的参数

3.Result:后台任务执行完毕需要返回的结果

当一个异步的任务执行,会执行4个方法,分别是:

1.onPreExecute():在异步任务调用之前,由UI线程中调用。通常用于异步任务的准备工作。

2.doinBackground(Params …):在上一步执行完毕后立即执行。是比较耗时的一步,也是由这步传入参数Params。在这里不仅可以产生最后的结果result,而且能调用publishProgress(Progress...)刷新UI

3.onProgressUpdate(Progress...):在第二步中调用publishProgress()之后,UI线程则会调用此方法。举个例子,就像你先在异步的线程中传入UI线程的handler,当执行的过程中,你可以通过消息机制向主线程发送消息,来更新UI。而publishProgress就是发送消息,主线程就会调用onProgressUpdate

4.onPostExecute(Result):当异步的任务执行完毕之后,由UI线程调用。在这个方法中可以得到最终的异步结果。

本文主要讲解这4个回调函数的调用流程,

首先看构造函数:

    public AsyncTask() {
        mWorker = new WorkerRunnable<Params, Result>() {
            public Result call() throws Exception {
                mTaskInvoked.set(true);

                Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
                return postResult(doInBackground(mParams));
            }
        };

        mFuture = new FutureTask<Result>(mWorker) {
            @Override
            protected void done() {
                try {
                    final Result result = get();

                    postResultIfNotInvoked(result);
                } 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) {
                    postResultIfNotInvoked(null);
                } catch (Throwable t) {
                    throw new RuntimeException("An error occured while executing "
                            + "doInBackground()", t);
                }
            }
        };
    }

构造函数里面创建了2个对象,mWorker和mFuture。mWorker是一个Callable,mWorker实现了其call( ) 方法。

mFuture是一个FutureTask,这个FutureTask使用Callable作为构造函数的参数,并实现了done( )方法。

再来看看AsyncTask的execure(Param...)方法:

    public final AsyncTask<Params, Progress, Result> execute(Params... params) {
        return executeOnExecutor(sDefaultExecutor, params);
    }

    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.execute(mFuture);

        return this;
    }
现在从execute开始分析:

1、execute调用executeOnExecutor

2、executeOnExecutor调用onPreExecute

3、随后执行:exec.execute(mFuture)

4、mFuture被执行后,mWorker的call()开始执行

5、call()里面调用doInBackground()

6、doInBackground()执行完成后,会执行postResultIfNotInvoked(result),执行postResult()

7、postResult导致主线程执行result.mTask.finish(result.mData[0])

8、finish()会调用onPostExecute()

至此,4个回调方法中的3个已经讲完了。

还剩下onProgressUpdate(),其实onProgressUpdate()的执行是被动的,所以不在上面的分析之中,它的执行需要app去调用publishProgress。

app一般会在doInBackground()中的循环中执行publishProgress,这样就回调到onProgressUpdate,而onProgressUpdate()一般被实现为更新UI的函数。
至此4个函数都分析到了,如果读者对Callable和FutureTask不是很理解,请阅读我的上一篇文章:Java FutureTask理解

分享到:
评论

相关推荐

    Android AsyncTask 源码解析

    代码为博客的示例代码,有问题请博客中留言:http://blog.csdn.net/lmj623565791/article/details/38614699

    异步任务Asynctask源码与反编译对比

    异步任务Asynctask源码与反编译对比,来分析源代码

    Android代码-Android 一些重要知识点解析整理

    Android中AsyncTak的使用与源码分析 Android AsyncTask 完全解析,带你从源码的角度彻底理解 Android 异步消息处理机制完全解析,带你从源码角度彻底理解 Android 异步消息处理机制 让你深入理解 Looper、...

    Android AsyncTask实现机制详细介绍及实例代码

    主要介绍了Android AsyncTask实现机制详细介绍及实例代码的相关资料,这里附有示例代码,帮助大家学习理解,需要的朋友可以参考下

    Android AsyncTask完全解析 带你从源码的角度彻底理解

    我们都知道,Android UI是线程不安全的,如果想要在子线程里进行UI操作,就需要借助Android的异步消息处理机制。...不过今天我还是准备从AsyncTask的基本用法开始讲起,然后我们再来一起分析下AsyncTask源码,看看它

    Java最全面试题宝典.rar

    AsyncTask源码分析 插件化技术 自定义控件 事件分发机制 ANR问题 Art和Dalvik的区别 Android关于OOM的解决方案 Fragment Activity&Fragment SurfaceView Android几种进程 APP启动过程 Activity启动流程以及界面展示...

    最全java面试题.zip

    AsyncTask源码分析 插件化技术 自定义控件 事件分发机制 ANR问题 Art和Dalvik的区别 Android关于OOM的解决方案 Fragment Activity&Fragment SurfaceView Android几种进程 APP启动过程 Activity启动流程以及界面展示...

    Android代码-AndroidNote Android笔记

    ListView源码分析 VideoView源码分析 View绘制过程详解 网络部分 HttpURLConnection详解 HttpURLConnection与HttpClient volley-retrofit-okhttp之我们该如何选择网路框架 Volley源码分析 Retrofit详解(上) Retrofit...

    Android中AsyncTask与handler用法实例分析

    主要介绍了Android中AsyncTask与handler用法,以实例形式较为详细的分析了Android中AsyncTask与handler的功能、用法与相关注意事项,并附带完整实例源码供读者下载,需要的朋友可以参考下

    Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)

    主要介绍了Android通过Handler与AsyncTask两种方式动态更新ListView的方法,结合实例形式分析了ListView动态更新的常用技巧,并附上完整实例源码供读者下载,需要的朋友可以参考下

    android开发资料大全

    Android核心分析28篇,强烈推荐android初学者,android进阶者看看这个系列教程 Android应用开发者指南:性能优化 android开发教程合集(推荐新手看下这一季教程) 新手入门 会员贡献电子图书整理(内含PDF下载) ...

    Android开发艺术探索.任玉刚(带详细书签).pdf

    本书是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。本书从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第二,结合Android源代码和应用层...

    Android开发艺术探索

    《Android开发艺术探索》是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。《Android开发艺术探索》从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些...

    android异步消息机制 从源码层面解析(2)

    它提供了Params, Progress和 Result三个泛型参数,在下面会仔细分析这三个泛型参数的具体含义。 AsyncTask提供了四个核心方法 onPreExecute() 此方法在主线程中执行,在异步任务执行之前,此方法会被调用,一般用于...

    AsyncTaskDemo

    介绍了AsyncTask的使用,及源码分析。线程池,有返回值的线程。

    浅谈Android中多线程切换的几种方法

    我们知道,多线程是Android开发中必现的场景,很多原生API和开源项目都有多线程的内容,这里简单总结和探讨一下常见的多线程切换方式。 我们先回顾一下Java多线程的几个基础内容,然后再分析总结一些经典代码中对于...

Global site tag (gtag.js) - Google Analytics