位置: 编程技术 - 正文

Android AsyncTask简要分析

编辑:rootadmin

推荐整理分享Android AsyncTask简要分析,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

在Android中实现异步任务机制有两种方式,Handler和AsyncTask。请参考Handler的简要分析,本文重点从源码角度分析AsyncTask的大致流程。 一个异步任务的执行一般包括以下几个步骤: 1.execute(Params… params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。 2.onPreExecute(),在execute(Params… params)被调用后立即执行,一般用来提高用户体验,显示加载进度条。 3.doInBackground(Params… params),在onPreExecute()完成后立即执行,一般在子线程中执行,用于执行较为耗时的操作。在执行过程中可以调用publishProgress(Progress… values)来更新进度信息。 4.onProgressUpdate(Progress… values),在调用publishProgress(Progress… values)时,此方法被执行,直接将进度信息更新到UI组件上。 5.onPostExecute(Result result),doInBackground(Params… params)执行完毕后,此方法将会被调用,同时子线程执行结果以参数的形式传过来,可以将结果显示到UI组件上。 6.onCancelled() 调用该方法在取消消息后进行一些操作。 从上面的简单介绍可以看出,以上方法的执行是有一定顺序的,那么它如何做到的呢?下面从源码角度进行分析!

1、首先当开发者调用execute(Params… params)时:

执行execute,最终是执行executeOnExecutor(sDefaultExecutor, params),该方法是是重点。 (1)该方法修改了mStatus的值,由此可以看出,异步任务只能执行一次,再次进入该方法由于mStatus = Status.RUNNING会进入到switch中而抛出异常。 (2)传递的参数为sDefaultExecutor。有上面定义可知是实例化了SerialExecutor类,调用了exec.execute(mFuture):

execute方法最终都会调用scheduleNext()方法,最终是执行THREAD_POOL_EXECUTOR.execute(mActive);有上面定义可知,THREAD_POOL_EXECUTOR是一个线程池,所以exec.execute(mFuture)的实质是从线程池中取出线程来执行。只不过在调用scheduleNext()方法之前,调用了mTasks.offer()方法,该方法的作用是将Runnable对象存放到线程队列最后的位置中。

这样就可以按照队列存放的顺序依次取出Runnable来执行了。 取出Runnable后执行run方法,该方法调用了r.run();此处的r为传入的mFuture。这个类的定义在开发者实例化AsyncTask时:

在实例化AsyncTask时,也实例化了mWorker和mFuture,调用r.run(),实际上是调用mFuture.run();

Android AsyncTask简要分析

注意加粗部分,即调用了mWorker.call()方法。有上面代码可知call方法最终调用postResult(doInBackground(mParams))方法。里面的doInBackground即为开发者重写的doInBackground方法。而postResult方法:

该方法实质上是通过handler发送一个MESSAGE_POST_RESULT消息。该handler是InternalHandler的一个实例。

此处finish方法有两个作用,如果开发者没有在这之前取消消息,即调用onPostExecute(result)方法。 而如果开发者取消了消息,即开发者调用了cancel(true)方法:

该方法里面调用了mFuture.cancel(mayInterruptIfRunning):

该方法调用finishCompletion()方法,最后调用done()方法,而在mFutuer.done()里面,调用了postResultIfNotInvoked(get())方法:

该方法最终还是调用了postResult方法,发送一个MESSAGE_POST_RESULT消息,此时handler再次调用finish方法,此时isCancelled()为为true,调用开发者重写的onCancelled()方法。 至此,AsyncTask中的重要方法都通过追踪代码的形式对他们的执行流程有了一个大致的认识。总结一下: (1)AsyncTask主要是通过Handler+ThreadPoolExecutor实现。 (2)AsyncTask必须定义在主线程中。onPreExecute(),onProgressUpdate(Progress… values),onPostExecute(Result result),onCancelled()方法都是工作在线程中,doInBackground(Params… params)工作在子线程中,而不同线程之间的通信主要通过handler来实现。 (3)AsyncTask中线程池分为THREAD_POOL_EXECUTOR( 异步线程池) SERIAL_EXECUTOR(同步线程池),默认为同步线程池,通过定义看以看出: private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR;但是从本质来看,通过上面的代码跟踪,我们看以知道sDefaultExecutor最终还是调用了THREAD_POOL_EXECUTOR的execute方法。只是在调用之前通过一个队列将任务有序的存放起来,保证任务的顺序执行。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android 网络编程之 XML 和 JSON 解析 通常情况下,每个需要访问网络的应用程序都会有一个自己的服务器,我们可以向服务器提交数据,也可以从服务器上获取数据。网络上传输数据时最

Spring+MyBatis+Velocity+BootStrap实现Android混合App快速高效服务端 大资源系统数据展示原型效果架构选型MyBatis:快速、高效、简洁的数据库数据映射到Java容器中,采用通用的Mapper文件几乎不用针对每个对象写映射文件

Android基础知识_Application的用途 一、Application概述1.API类的继承关系2.API类的概述那些需要保持全局应用程序状态的基类。通过在AndroidManifest.xml的application标签指定它的名字你能提供自

标签: Android AsyncTask简要分析

本文链接地址:https://www.jiuchutong.com/biancheng/376571.html 转载请保留说明!

上一篇:Android控件之Button点击事件监听器的绑定(andriod 控件)

下一篇:Android 网络编程之 XML 和 JSON 解析(安卓网络编程面试题)

  • 增值税税率是怎么规定的
  • 环境保护税的应税污染物有哪些
  • 金税四期对增值税发票的比对
  • 工商年报纳税总额怎么算
  • 企业所得税职工薪酬扣除
  • 纳税人少缴税款,税务机关发现之日怎么算
  • 公司出售房产的税费
  • 出口货物退运管理办法
  • 客户往来对账单
  • 小规模纳税人汇算清缴要填什么表
  • 小规模纳税人免税会计分录
  • 调账以前年度损益调整如何结转
  • 财务发票已开但钱未到位怎么处理?
  • 季度企业所得税申报表怎么填写
  • 电力设备维护费增值税税率
  • 营改增后建筑行业税率
  • 关于保险机构代收车船税开具增值税发票问题的公告
  • 6月实施的新政有哪些?
  • 企业注销前注册资本必须到账吗
  • 企业对外投资需要哪些审批
  • 快递公司之间的合作模式
  • 基本户没开 可以销户吗
  • 劳务费个人所得税税率表2023最新
  • 购销合同没写签订日期违法吗
  • 苹果mac怎么复制文件到u盘 免费软件
  • 对账工作的主要内容为什么不包括账表核对
  • 公司取得的营业收入
  • 不吃晚饭多久能瘦下来
  • php file_exists 检查文件或目录是否存在的函数
  • php timestamp
  • 小规模差额征税是什么意思
  • 公司未经营需要做所得税年度清缴吗
  • php实现验证码功能
  • 办理房屋租赁需要的材料
  • 公司投资款无法收回
  • 一文读懂谢娜张杰购房跳单事件始末
  • php解析配置文件
  • php使用什么开发工具
  • Element UI - v-infinite-scroll无限滚动组件
  • spring集成xfire
  • php fopen函数的用法
  • mkdir命令怎么用
  • 企业在外地单位怎么交税
  • 分公司非独立核算怎么做账
  • 将织梦dedecms转换到wordpress
  • 企业的固定资产因自然灾害产生的净损失计入
  • 退还押金的会计分录怎么写
  • 预缴所得税年底处理账务吗
  • 应税项目和非应税项目分类
  • sqlserver2005 TSql新功能学习总结(数据类型篇)
  • 坏账准备是啥意思
  • 银行汇票计入什么会计科目
  • 银行贴现手续费可以税前扣除吗
  • 小规模纳税人可以转为一般纳税人吗?
  • 企业年报修改后没有公示怎么办
  • 主营业务收入和库存商品怎么区分
  • 餐饮服务的监管由哪个部门负责
  • 内勤会计是不是不算会计
  • mysql8.0并行复制
  • win7提示oxcooooo98
  • windowsserver2003ftp服务器怎么搭建
  • putty如何登录linux
  • 如何关闭mac上的icloud
  • 主板各个系列详解
  • Win7旗舰版系统安装
  • win8怎么打开系统设置
  • Ubuntu安装VMware tools
  • 如何调整windows桌面图标大小
  • w8系统文件夹怎么设置密码
  • 对象转化为字符串的几种方式
  • 谈谈Jquery ajax中success和complete有哪些不同点
  • js类继承的几种方式
  • nodejs cicd
  • linux shell脚本命令
  • python编写步骤
  • animate怎么整个图层移动
  • 综合所得申报表在哪里
  • 现行增值税税率表2023
  • 消费发票上的金额含税吗
  • 该纳税人还未申报,请申报成功后
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设