AsyncTask是一个抽象类,它是由Android封装的一个轻量级异步类(轻量体现在使用方便、代码简洁),它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。

AsyncTask的内部封装了两个线程池(SerialExecutor和THREAD_POOL_EXECUTOR)和一个Handler(InternalHandler)。
其中SerialExecutor线程池用于任务的排队,让需要执行的多个耗时任务,按顺序排列,THREAD_POOL_EXECUTOR线程池才真正地执行任务,InternalHandler用于从工作线程切换到主线程。

1.AsyncTask的泛型参数
AsyncTask的类声明

public abstract class AsyncTask<Params, Progress, Result>

AsyncTask是一个抽象泛型类
Params:开始异步任务执行时传入的参数类型
Progress:异步任务执行过程中,返回下载进度值的类型
Result:异步任务执行完成后,返回的结果类型
如果AsyncTask确定不需要传递具体参数,那么这三个泛型参数可以用Void来代替。

2.AsyncTask的核心方法
onPreExecute()
这个方法会在后台任务开始执行之前调用,在主线程执行。用于进行一些界面上的初始化操作,比如显示一个进度条对话框等。

doInBackground(Params…)
这个方法中的所有代码都会在子线程中运行,我们应该在这里去处理所有的耗时任务。
任务一旦完成就可以通过return语句来将任务的执行结果进行返回,如果AsyncTask的第三个泛型参数指定的是Void,就可以不返回任务执行结果。注意,在这个方法中是不可以进行UI操作的,如果需要更新UI元素,比如说反馈当前任务的执行进度,可以调用publishProgress(Progress…)方法来完成。

onProgressUpdate(Progress…)
当在后台任务中调用了publishProgress(Progress…)方法后,这个方法就很快会被调用,方法中携带的参数就是在后台任务中传递过来的。在这个方法中可以对UI进行操作,在主线程中进行,利用参数中的数值就可以对界面元素进行相应的更新。

onPostExecute(Result)
当doInBackground(Params…)执行完毕并通过return语句进行返回时,这个方法就很快会被调用。返回的数据会作为参数传递到此方法中,可以利用返回的数据来进行一些UI操作,在主线程中进行,比如说提醒任务执行的结果,以及关闭掉进度条对话框等。

上面几个方法的调用顺序: onPreExecute() --> doInBackground() --> publishProgress() --> onProgressUpdate() --> onPostExecute()
如果不需要执行更新进度则为onPreExecute() --> doInBackground() --> onPostExecute()

除了上面四个方法,AsyncTask还提供了onCancelled()方法,它同样在主线程中执行,当异步任务取消时,onCancelled()会被调用,这个时候onPostExecute()则不会被调用,但是要注意的是,AsyncTask中的cancel()方法并不是真正去取消任务,只是设置这个任务为取消状态,我们需要在doInBackground()判断终止任务。就好比想要终止一个线程,调用interrupt()方法,只是进行标记为中断,需要在线程内部进行标记判断然后中断线程。

3.使用AsyncTask的注意事项
①异步任务的实例必须在UI线程中创建,即AsyncTask对象必须在UI线程中创建。
②execute(Params… params)方法必须在UI线程中调用。
③不要手动调用onPreExecute(),doInBackground(Params… params),onProgressUpdate(Progress… values),onPostExecute(Result result)这几个方法。
④不能在doInBackground(Params… params)中更改UI组件的信息。
⑤一个任务实例只能执行一次,如果执行第二次将会抛出异常。

AsyncTask简介相关推荐

  1. 【Android 电量优化】电量优化 ( JobScheduler | JobService | AsyncTask )

    文章目录 一.JobScheduler 使用流程 二.AsyncTask 简介 三.JobScheduler 开发流程 四.JobScheduler 代码示例 1.JobScheduleManager ...

  2. Android中的AsyncTask异步加载图片

    AsyncTask简介: AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦. 阅读 AsyncTask的源码可知,AsyncTa ...

  3. AsyncTask源码解析,你需要摸清的细节

    AsyncTask简介 1. AsyncTask提供了一种恰当的简单的跟UI Thread交互的方式. 2. 它不需要通过操控Threads或Handler就可以将后台操作以及其结果展示在UI Thr ...

  4. AsyncTask 详解

    AsyncTask 简介 AsyncTask,即异步任务,是 Android 给我们提供的一个处理异步任务的类.通过 此类,可以实现主线程和后台线程的通讯.后台线程执行异步任务,并把结果返回 给主线程 ...

  5. 大话Android多线程(六) AsyncTask知识扫盲

    版权声明:本文为博主原创文章,未经博主允许不得转载 源码:github.com/AnliaLee 大家要是看到有错误的地方或者有啥好的建议,欢迎留言评论 前言 本章我们将结合之前几篇博客,来研究研究多 ...

  6. android面试题总结加强

    在加强版的基础上又再加强的android应用面试题集 有些补充略显臃肿,只为学习 1.activity的生命周期. 方法 描述 可被杀死 下一个 onCreate() 在activity第一次被创建的 ...

  7. Android面试题集合

    Java基础 简述题(一) &和&&的区别. Get和Post的区别 http response code udp连接和TCP的不同之处 java中的soft referenc ...

  8. Android线程与ANR

    本人博客原文 第一部分 Android线程 Android线程模型 Android的每个进程有一个称为"main"主线程(也称UI线程)的线程.它除了负责所有事件的分发和处理,还负 ...

  9. android 面试题(史上最全)

    1.activity的生命周期. 方法 描述 可被杀死 下一个 onCreate() 在activity第一次被创建的时候调用.这里是你做所有初始化设置的地方──创建视图.设置布局.绑定数据至列表等. ...

最新文章

  1. 矩阵方阵matlab,求助!!错误使用 inv 矩阵必须为方阵。
  2. 如何跟踪log4j漏洞原理及发现绕WAF的tips
  3. Android 友盟分享躺过的几个坑,大坑,坑爹啊
  4. html 5 canvas flash,为什么使用HTML5 Canvas创建内容比使用Flash创作要复杂得多?
  5. 3_Long Short Term Memory (LSTM)
  6. Android签名机制:生成keystore、签名、查看签名信息
  7. java连接mysql数据库 R_Java连接Mysql数据库详细代码实例
  8. java使用poi读取存储excel表格,包括xls和xlsx格式
  9. 2019最新猎豹网校JAVA语言数据结构与算法教程(Java语言 )
  10. linux-ab压力测试
  11. 快解析结合任我行crm
  12. 去除面部黑色素小妙招_去除脸部黑色素7个小方法
  13. HAL库配置F407ZE DDS AD9854
  14. 带sex的net域名_域名劫持的几种方法、域名劫持有什么方式
  15. 长江现在真的成了黄金水道了
  16. 完整性+存储过程和函数——CHECK / CONSTRAINT / TRIGGER / PROCEDURE/ FUNCTION
  17. 为什么 JSON 不支持注释?
  18. 做速卖通的优势和不足
  19. 王文彬:阿里云的下一步
  20. 揭秘:宜信科技中心如何支持公司史上最大规模全员远程办公|上篇

热门文章

  1. 长篇分享腾讯工作的环境、待遇等
  2. LRUCache简单实现
  3. 定义一个点类(Point)、圆类(Circle)和圆柱体类(Cylinder)的层次结构。圆包括圆心和半径两个数据成员,圆心具有点类的所有特征。圆柱体类由半径和高构成。要求各类提供支持初始化的构造函数
  4. SpringSecurity如何处理logout注销操作
  5. 域账户或者本地用户,每次开机登陆都重置桌面
  6. BUUCTF-社团考核
  7. 升级autoconf版本 Autoconf version 2.68 or higher is required
  8. MySQL数据库——数据库设计概念和数据库设计步骤
  9. 西门子PPI协议的工控通信控件
  10. Java生成微信群组图标