一、关于AysncTask

AsyncTask使得多线程编程更加简单,AsyncTask能在后台线程执行异步任务,并且在UI线程更新界面,而不再需要用户去操作Thread和Handler。AysncTask是一个抽象类,类关系如下:

public abstract class

AsyncTask

extends Object

java.lang.Object
   ↳ android.os.AsyncTask<Params, Progress, Result>
 

*AsyncTask适合比较简单的操作(最多几秒钟),如网络请求,如果需要线程运行较长一段时间,建议使用 java.util.concurrent包中的API,例如Executor,ThreadPoolExecutor 和 FutureTask.

二、AsyncTask的使用

一个异步的任务由系统决定运行在一个后台线程,运行结果在UI线程更新。AsyncTask一个异步任务,由一中的类关系可以看到定义了3个泛型类型,分别是Params,Progress 和 Result,另外还定义了4个步骤(方法),分别是onPreExecute,doInBackground, onProgressUpdate 和onPostExecute.

AsyncTask 是抽象类,必须被子类继承后使用,子类必须重写一个方法(doInBackground(Params...)),大多数情况下也会重写另一个方法(onPostExecute(Result).)

我们先看下Android官方提供的示例代码,然后再做解释:

 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");}}

三、AsyncTask接收的三个泛型

从示例代码可以看到二中所说的3个参数,下面是官方文档中的解释,下图中展示了3个参数的关系:

1  Params, 后台任务执行所需的数据,如:网络请求的url地址

2  Progress, 后台任务执行距离完成的百分比

3  Result 后台任务执行完成的结果

*以上的三个参数哪个不需要使用的话可用void

四、AsyncTask中的四步(四个方法)

当一个AsyncTask 执行时,会调用以下四步(如二中所说,需要重写doInBackground方法来执行后台代码,其它三个方法都是可选的):

1  onPreExecute()  这步在UI线程中执行,一般用来做后台任务执行前的准备工作,例如在界面显示一个进度条。

2  doInBackground(Params...)  这一步会在onPreExecute()执行完成后立即被执行,即在后台线程中执行耗时的任务。AsyncTask的参数会被传下来,后台任务的执行结果必须在这一步中被return,然后会被传递给最后一步。这一步也可以用publishProgress(Progress...)来更新进度,对应值会传递到在UI线程中执行的onProgressUpdate(Progress...)这一步。

3  onProgressUpdate(Progress...)  这一步会在上一步调用publishProgress(Progress...)后在UI线程执行,用来在用户界面上显示进度。例如,显示一个动态的进度条或者直接在textfiled种显示信息。

4  onPostExecute(Result)  这一步是在后台任务完成后在UI线程执行,后台任务的结果会被作为参数传进来

五、取消AsyncTask任务

可以调用 cancel(boolean) 方法来取消一个正在执行的AsyncTask任务。执行这个方法后会使得isCancelled()方法反回true,并且在doInBackground(Object[])执行完成后会调用执行onCancelled(Object)方法而不是onPostExecute(Object)方法。调用cancel(boolean)方法后,并不保证任务马上被取消,为了使得任务被尽快的取消,应该总是周期性地在doInBackground(Object[])中检查isCancelled()的返回值(如二中的官方示例代码)

六、AsyncTask的几天规则

以下是官方指明的使用AsyncTask需要遵从的几条规则:

• AsyncTask类实例必须在UI线程中创建

• execute(Params...)方法必须要在UI线程中调用

•不要手动调用onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...)方法

• 一个任务不能被同时执行多次(第二次就会抛出异常)

七、一个简单的Demo示例代码:

实例代码来自:http://samir-mangroliya.blogspot.in/p/android-asynctask-example.html

实例代码下载:  http://download.csdn.net/detail/dolacmeng/9336017

Demo执行效果:

【Android】AsyncTask异步类相关推荐

  1. android服务绑定异步,Android中异步类AsyncTask用法总结

    本文总结分析了Android中异步类AsyncTask用法.分享给大家供大家参考,具体如下: 最近整理笔记的时候,看到有关AsyncTask不是很理解,重新疏导了一下,有在网上找了一些资料,个人不敢独 ...

  2. android asynctask异步处理抓取网页,Android处理异步耗时任务,AsyncTask使用教程

    原文链接:http://www.jufanshare.com/content/124.html 本教程附Demo:https://gitee.com/qwertiddler/AsyncTask.git ...

  3. Android AsyncTask异步线程

        (图)           在开发Android移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给用户带来不好的用户体验.但是在子线程中 ...

  4. 使用Android AsyncTask异步线程

    本文地址:http://blog.csdn.net/csheng1204/article/details/7233863 转载请注明,谢谢~ 首先声明一下,本人是一个只学了几个月Android的新手, ...

  5. Android 消息异步处理之AsyncTask

    Android提供了异步处理消息的方式大致有两种,第一种是handler+Thread,之前已经对于这种方式做过分析,第二种就是AsyncTask,这是Android1.5提供的一种轻量级的工具类,其 ...

  6. 【Android 异步操作】AsyncTask 异步任务 ( FutureTask 模拟 AsyncTask 执行过程 | AsyncTask 执行过程回顾 | FutureTask 分析 )

    文章目录 一.FutureTask 使用流程 二.FutureTask 模拟 AsyncTask 执行过程 三.AsyncTask 执行过程回顾 四.FutureTask 分析 一.FutureTas ...

  7. 【Android 异步操作】AsyncTask 异步任务 ( AsyncTask 异步任务执行方法 execute 方法相关源码解析 )

    文章目录 一.AsyncTask 异步任务执行方法 execute() 引入 二.AsyncTask 异步任务执行方法 execute() 三.sDefaultExecutor 线程池解析 四.exe ...

  8. 【Android 异步操作】AsyncTask 异步任务 ( 参数简介 | 方法简介 | 使用方法 | AsyncTask 源码分析 )

    文章目录 一.AsyncTask 参数简介 二.AsyncTask 方法简介 三.AsyncTask 基本用法 四.AsyncTask 构造函数源码解析 五.AsyncTask 构造函数相关源码注释 ...

  9. Android中的AsyncTask异步任务的简单介绍

    事件原由: 很多耗时的资源在安卓客户端加载时,必须要开启一个新的线程去操作维护,而如果直接在主线程中加载的话,客户端会直接报出异常,导致程序不能正常使用,而子线程无法直接更新UI,因此客户端提供了   ...

最新文章

  1. 【Prometheus】 Prometheus 入门到实战搭建监控系统
  2. 工作总结 npoi 模板 导出公式 excel
  3. 一张自拍变6种风格漫画,视频也支持,全程稳定不“掉线”,这个AI不到一天狂揽1800赞...
  4. Paper:《Generating Sequences With Recurrent Neural Networks》的翻译和解读
  5. java对象赋值_Java 对象不使用时为什么要赋值为 null?
  6. Codeforces Round #647 (Div. 2) - Thanks, Algo Muse!(AB)
  7. 怪不得超市不让带宠物...
  8. LeetCode 03. 无重复字符的最长子串
  9. 160 - 17 bjanes.3
  10. jvm 加载class文件过程
  11. [Robot Framework] User Guide : 如何自己创建library
  12. 刚刚开通blog写下几段文字,以表意义
  13. python pip下载本地依赖包,并在离线环境中安装,并解决报错ERROR: Could not find a version that satisfies the requirement报错
  14. php中的正则表达式相关例题,实例学习PHP中的正则表达式
  15. 谷粒商城:跨域问题解决
  16. Halcon 阈值算子汇总
  17. SQL零基础入门学习(八)
  18. 生成淘宝短链tb.cn
  19. webrtc 搭建直播平台
  20. Android开发知识(二十三)从源码角度分析ListView的滑动复用机制

热门文章

  1. Spring+SpringMVC+shiro+mysql(一)
  2. sql server 2008 修改sa密码
  3. 用百度直达号获取新用户 让顾客直达商家服务
  4. smarty的简单分页
  5. CentOS 6虚拟机安装
  6. 百度PHP高级顾问惠新宸:PHP在百度的发展历程
  7. Varnish Cache 3.0.0安装
  8. ASP.Net中利用CSS实现多界面两法
  9. ASP.NET中实现打印
  10. bug诞生记——信号(signal)处理导致死锁