AysncTask 源码和底层原理总结

AsyncTask本质:对线程池和Handler的封装

采用了模板设计模式

一个异步任务的执行一般包括以下几个步骤

(1)execute(Params…params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。
(2)onPreExecute(),在execute(Params…params)被调用后立即执行,执行在UI线程,一般用来在执行后台任务前对UI做一些标记。
(3)doInBackground(Params…params),在onPreExecute()完成后立即执行,用于执行较为耗时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress…values)来更新进度信息。
(4)onProgressUpdate(Progress…values),执行在UI线程。在调用publishProgress(Progress…values)时,此方法被执行,直接将进度信息更新到UI组件上。
(5)onPostExecute(Result result),执行在UI线程。当后台操作结束时,此方法将会被调用,doInBackground函数返回的计算结果将作为参数传递到此方法中,直接将结果显示到UI组件上。

注意点

(1)异步任务的实例必须在UI线程中创建。
(2)execute(Params…params)方法必须在UI线程中调用。
(3)不能在doInBackground(Params…params)中更改UI组件的信息。
(4)一个任务实例只能执行一次,如果执行第二次将会抛出异常。(一个AsyncTask实例只能运行一次

源码分析

(1)doInBackground(Params…params)是一个抽象方法,继承AsyncTask时必须覆写此方法。
(2)onPreExecute(),onProgressUpdate(Progress…values),onPostExecute(Result result),onCancelled()这几个方法体都是空的,需要的时候可以选择性地覆写它们。
(3)publishProgress(Progress…values)是final修饰的,不能覆写,只能去调用,一般会在doInBackground(Params…params)中调用此方法来更新进度条。
(4)Status枚举类代表了AsyncTask的状态,有三种状态:PENDING未执行状态 RUNNING执行中 FINISHED执行完成。
(5)内部使用了ThreadPoolExecutor,初始化需要线程队列,线程工厂。线程池管理器默认的任务调度是顺序执行。
(6)FutureTask类型,是作为一个可管理的异步任务,使得这些异步任务可以被更精确地控制。
(7)finish()方法是负责调用onPostExecute(Result result)方法显示结果并改变任务状态的。
(8)在mWorker的call()函数中最终调用了AsyncTask的doInBackground函数。
(9)sHandler实例实际上是AsyncTask的内部类InternalHandler的实例,而InternalHandler继承了Handler。

方法执行过程

当调用了AsyncTaskexecute(Params…params)方法后,execute方法会调用onPreExecute()方法,然后由ThreadPoolExecutor实例sExecutor执行一个FutureTask任务,这个过程中doInBackground(Params…params)将被调用,如果被开发者覆写的doInBackground(Params…params)方法中调用了publishProgress(Progress…values)方法,则通过InternalHandler实例sHandler发送一条MESSAGE_POST_PROGRESS消息,更新进度,sHandler处理消息时onProgressUpdate(Progress…values)方法将被调用;如果遇到异常,则发送一条MESSAGE_POST_CANCEL的消息,取消任务,sHandler处理消息时onCancelled()方法将被调用;如果执行成功,则发送一条MESSAGE_POST_RESULT的消息,sHandler处理消息时会调用onPostExecute(Result result)方法让用户得以在UI线程处理结果。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring 是一个非常流行的开源框架,它提供了许多功能强大的模块和工具,使得 Java 应用程序的开发变得更加容易和高效。Spring 的底层原理源码分析是理解 Spring 框架的关键。 Spring 的底层原理主要包括以下几个方面: 1. IoC(Inverse of Control,控制反转)容器:Spring 的 IoC 容器负责管理应用程序中的所有对象,包括创建、初始化、配置和销毁等操作。它通过依赖注入(Dependency Injection,DI)的方式将对象之间的依赖关系进行管理,实现了对象的松耦合和可重用性。 2. AOP(Aspect Oriented Programming,面向切面编程)框架:Spring 的 AOP 框架允许在应用程序中定义切面(Aspect),并将它们与其他对象进行织入(Weaving),从而实现横切关注点(Cross-Cutting Concerns)的统一处理,如事务管理、日志记录、安全控制等。 3. JDBC(Java Database Connectivity,Java 数据库连接)框架:Spring 的 JDBC 框架提供了一组简单、易用的 API,使得 Java 应用程序可以方便地访问和操作数据库,同时还支持事务管理、异常处理等功能。 4. MVC(Model-View-Controller,模型-视图-控制器)框架:Spring 的 MVC 框架提供了一种基于 MVC 设计模式的 Web 应用程序开发方式,它将请求和响应的处理分离,使得应用程序的逻辑层和视图层更加清晰和易于维护。 对于 Spring 框架的源码分析,可以从以下几个方面进行深入研究: 1. IoC 容器的实现原理:了解 Spring IoC 容器的实现原理,包括 Bean 的加载、实例化、属性注入、生命周期管理等方面,可以更好地掌握 Spring 的核心功能。 2. AOP 框架的实现原理:研究 Spring AOP 框架的实现原理,包括切面的定义、切点的匹配、通知的织入等方面,可以深入理解 AOP 技术的本质和应用。 3. JDBC 框架的实现原理:探究 Spring JDBC 框架的实现原理,包括数据源的配置、SQL 语句的生成、结果集的处理等方面,可以理解 JDBC 技术的底层实现和优化。 4. MVC 框架的实现原理:了解 Spring MVC 框架的实现原理,包括请求的处理流程、控制器的注册和映射、视图的解析和渲染等方面,可以深入了解 Web 应用程序的开发和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值