Android 解析AsyncTask(一)

大家都知道在开发Android中涉及到UI的修改都必须在UI线程中操作,并且执行耗时的操作绝不能在UI线程上干,一般使用线程或者开启线程池处理。如果要把耗时的任务执行的结果显示到UI上,也许会使用Thread+Handler这种方式来处理,但是个人感觉其内聚性不是很高。而AsyncTask非常适合上述应用场景,它其实是Thread+Handler的结合体,通过它你可以执行耗时的操作,并把结果转移到UI线程中,甚至可以显示执行进度,下面阐述下它的基本使用方法。

使用

AsyncTask是个抽象类,如果你使用的话必须要实现doInBackground(Params…)方法,一般的话你也要复写onPostExecute(Result),下面给出一个简单的样例

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {protected Long doInBackground(URL... urls) {int count = urls.length;long totalSize = 0;for (int i = 0; i < count; i++) {totalSize += Downloader.downloadFile(urls[i]);publishProgress((int) ((i / (float) count) * 100));// Escape early if cancel() is calledif (isCancelled()) break;}return totalSize;}protected void onProgressUpdate(Integer... progress) {setProgressPercent(progress[0]);}protected void onPostExecute(Long result) {showDialog("Downloaded " + result + " bytes");}}

上述类创建好后,就可以轻松调用了,

new DownloadFilesTask().execute(url1, url2, url3);

AsyncTask的三种参数类型

当你继承AsyncTask时需要你指定三种参数类型

  1. Params, 就是AsyncTask执行时接受的可变参数类型,
    也是方法doInBackground传入的参数类型

  2. Progress 进度更新时传入的参数也是方法
    publishProgress、onProgressUpdate传入的参数

  3. Result 后台执行后返回的数据类型

如果你觉得不需要参数的话,你可以都用Void来代替

private class MyTask extends AsyncTask<Void, Void, Void> { ... }

AsyncTask执行的四步

当一个异步任务被执行时,AsyncTask会执行下述四个步骤:

  1. onPreExecute(),
    该方法会在UI线程中调用并且是在任务被执行前调用,你可以在这里去创建一个对话框显示其进度或者提示信息。

  2. doInBackground(Params…),
    当onPreExecute()调用结束后该方法立马被执行并且是运行在后台线程中。所以你可以在该方法中执行耗时的操作比如网络的请求,文件下载等等。该方法的参数就是你传入给AsyncTask的参数,执行后会返回结果,并会把结果传递给第四步。你可以在该方法中调用publishProgress(Progress…)去发布进度信息,该进度信息会被转移到onProgressUpdate(Progress…)方法中。

  3. onProgressUpdate(Progress…),
    调用publishProgress(Progress…)后该方法会在UI线程中被调用,该方法能够显示后台任务执行的进度消息等。

  4. onPostExecute(Result),
    后台任务执行完毕后将调用该方法,并将计算的结果以参数的形式转移给该方法。

取消一个任务

你可以通过调用cancel(boolean)来取消任务,调用它后onCancelled(Object)将会在doInBackground(Object[]) 返回之后被调用,onPostExecute(Object)则不会执行,为确保任务能够被及时取消,建议取消前使用isCancelled()方法判断当前任务是否被取消。

注意事项

  • AsyncTask必须在UI线程创建,且方法execute(Params…) 也必须在UI线程中使用
  • 不要手动调用 onPreExecute(), onPostExecute(Result), doInBackground(Params…), onProgressUpdate(Progress…) 方法
  • 任务仅仅能被执行一次,如果调用多次execute方法将会抛出异常

Android 解析AsyncTask(一)相关推荐

  1. 【Android】AsyncTask原理应用及源码关键部分解析

    为了更加方便我们在子线程中更新UI元素,Android从1.5版本就引入了一个AsyncTask类,使用它就可以非常灵活方便地从子线程切换到UI线程.AsyncTask是android提供的轻量级的异 ...

  2. Android通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比

    在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一是 ...

  3. Android 解析软件包时出现问题 -- Error staging apk from content URI

    Android Version : 8.1 使用场景 : 在Rk3288w Android 8.1 的测试设备上安装 "文件管理器" 应用程序 , 若打开***.apk文件,会出现 ...

  4. android定义 task,Android中AsyncTask的基本用法

    首先: 了解一个知识点的用法,可以分四步: 第一:what是指AsyncTask的概念,从服务器下载资源,解析json文件,在开发Android应用时必须遵守单线程模型的原则: Android UI操 ...

  5. Android 利用 AsyncTask 异步读取网络图片

    1.新建Android工程AsyncLoadPicture 新建布局文件activity_main.xml主界面为一个ListView 2.功能主界面MainActivity.java,主代码如下 p ...

  6. 【Android】AsyncTask异步类

    一.关于AysncTask AsyncTask使得多线程编程更加简单,AsyncTask能在后台线程执行异步任务,并且在UI线程更新界面,而不再需要用户去操作Thread和Handler.AysncT ...

  7. Android 解析包出错问题

    2019独角兽企业重金招聘Python工程师标准>>> Android 解析包出错问题 app上线后经常会遇到安装包解析出错问题,今天刚好做个不完整的总结, 解决问题 检测系统是否开 ...

  8. Android解析WindowManagerService(二)WMS的重要成员和Window的添加过程

    前言 在本系列的上一篇文章中,我们学习了WMS的诞生,WMS被创建后,它的重要的成员有哪些?Window添加过程的WMS部分做了什么呢?这篇文章会给你解答. 1.WMS的重要成员 所谓WMS的重要成员 ...

  9. Android解析WindowManagerService(三)Window的删除过程

    相关文章 Android系统启动系列 Android深入四大组件系列 Android应用进程启动过程系列 Android解析WindowManager系列 前言 在本系列文章中,我提到过:Window ...

最新文章

  1. MySQL提权简单方法
  2. 【编程通识】PlantUML绘制时序图样例
  3. 疫情过后,2020年各省市GDP排行榜top10新鲜出炉,你的家乡排在第几?
  4. ASP.Net中无刷新执行Session身份验证
  5. jeecg自定义datagrid查询
  6. html body最小高度,CSS网页布局中的最小高度问题的解决方法
  7. 海量数据挖掘MMDS week2: 频繁项集挖掘 Apriori算法的改进:非hash方法
  8. 浅入深出Vue:数据渲染
  9. 人一生的8种朋友(看看身边的朋友属于哪种)
  10. oracle应付模块中的ov,oracle常用dba命令和知识下
  11. 2021计算机考研总结即经验贴(初试、复试、调剂、心态调整)
  12. 计算机编程及常用术语英语词汇大全
  13. 计算机本地连接怎么找不到了,电脑本地连接不见了该怎么办
  14. Echarts 图表不能渲染问题整理
  15. Chapter~3 Python基础
  16. 通过jmeter进行用户并发(vu/s)测试
  17. 小猫爪:S32K3学习笔记01-S32K3 RTD【MCALSDK】的使用和环境搭建
  18. iphonex美版型号对照表_iPhoneX国行和美版/港版/日版哪个好?苹果X各国家版本区别对比...
  19. 运维基本功(十二): Linux命令回顾与扩展
  20. Source Insight常用配置

热门文章

  1. koreader下载_koreader下载_koreader安装_koreader最新版_koreader安卓版下载_koreader app_易玩网...
  2. centos编译安装python_centos编译安装python3.6.4
  3. C语言写一个简单的数学程序,用C语言计算简单的数学式子
  4. Java使用Proxy和CGLib实现动态代理
  5. android 网络图片查看器,Handler的用法
  6. 【小白学习keras教程】六、基于CIFAR-10数据集训练CNN-RNN神经网络模型
  7. 股票系列,动态规划,加油,九月太浪了,十月不许浪
  8. 博后招募 | 新加坡国立大学WING实验室招募自然语言处理方向博士后
  9. 复旦大学邱锡鹏教授团队:Transformer最新综述
  10. Bengio、周志华、山世光、包云岗等200+位AI学术领袖邀你观看智源大会精彩论坛...