AsyncTask 顾名思义,是在我们需要执行同步任务的时候使用,这个类可以做一些后台操作,然后将结果返回的UI来,因为这个类本身封装了Handler和Thread,所以我们不需要直接去操作这两个类,使用起来也非常简单。

源码里的注释说了,AsyncTask适合做一些short operations(短操作),如果你需要长时间地维持多线程,建议用Executor,ThreadPoolExecutor,FutureTask等类来实现。

其实我们平常使用AsyncTask一般也都是在图片等小文件下载的时候使用。

我们使用AsyncTask时需要写一个类继承AsyncTask(AsyncTask是个抽象类),需要提供三个参数的泛型类型(AsyncTask类最重要的三个参数):

  • Params 任务执行前传到后台来的参数
  • Progress 后台任务执行的进度。
  • Result 后台执行任务最终返回的结果。

当一个同步任务执行时,要经历四个步骤(可以理解为生命周期)

  • onPreExecute(),在同步任务执行前会执行(做些准备工作,比如下载时,显示出进度条)(在UI线程执行)
  • doInBackground,最重要最核心的工作就在这个方法里进行,这个方法是执行在后台线程,在这个方法里你可以调用publishProgress()方法来改变进度(这个方法执行在UI线程),当然,如果你不需要显示进度也可以不使用。doInBackground最后要求返回一个result,即执行结果。
  • onProgressUpdate,当publishProgress()被调用时,即进度改变时,这个方法就会执行,在UI线程执行,可以在这个方法里改变进度条。当然跟publishProgress一样的,如果你不需要显示进度就无需用它。
  • onPostExecute,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回。
  public 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 called
if (isCancelled()) break;
}
return totalSize;
} protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
} protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}

我们只需要在UI线程里创立这个类的对象,然后调用其execute()方法就可以。如果你要取消AsyncTask任务,就执行cancel()方法,如果想在取消任务时做些操作,可以重写onCancelled(),这个方法会在任务cancel时取代onPostExecute被回调。

最新文章

  1. requestAnimationFrame,Web中写动画的另一种选择
  2. Matlab中fread函数的高级使用方法及其帮助文档中容易引起歧义的地方
  3. MINA系列学习-IoBuffer
  4. python mysql
  5. PHP zendframework phpunit 深入
  6. JAVA逻辑字符串判断真假
  7. php代码优化技巧
  8. Python高级之Socket 探索(五)
  9. BUG: scheduling while atomic: events/0/4/总结
  10. BootStrap TreeView使用示例
  11. ROS_Kinetic_06 ROS基础内容(三)
  12. 通行导论-IP数据网络基础(2)
  13. ImportError: No module named MySQLdb&lt;/module&gt;
  14. Generative Adversarial Nets[LSGAN]
  15. SOCKS5 协议解析
  16. windows10安装配置scikit-learn步骤
  17. jquery图片放大功能简单实现
  18. 2014-2015 ACM-ICPC, NEERC, Eastern Subregional Contest Problem G. The Debut Album
  19. 洛谷P2563 [AHOI2001]质数和分解
  20. lua工具库penlight--05日期和时间

热门文章

  1. JS中对象数据类型的基本结构和操作
  2. 什么是VPX技术?
  3. pandas-同时处理两行数据
  4. Go&#39;s Declaration Syntax
  5. NIO摘录
  6. springBoot+mysql+mybatis demo [基本配置] [遇到的问题]
  7. mongodb 索引基础
  8. springboot+jsp+mybatis项目实例(后台成功,但是无法跳转jsp页面,没有实体类的注解,看springboot+jsp第二弹相关配置,即可成功配置jsp)
  9. vagrant(一)初识与安装
  10. springmvc的@ModelAttribute