AsyncTask 简要介绍
当Android的UI线程超过5s未响应时,系统会引发ANR(Application Not Responding)异常,所以一般不在UI线程中执行耗时任务。一般是在其他线程中处理耗时任务,然后及时更新UI界面。AsyncTask是异步任务,能够更简单地解决此类问题。
一、为什么使用AsyncTask
为了避免在Android的主线程(UI线程)中处理耗时任务,通常是要建立一个新线程来处理耗时任务。但是,有时候我们需要一边处理任务一边及时更新UI组件,而问题出现了,非UI线程不能直接更新UI组件。Android为此提供了几种解决方法:
使用Handler实现线程之间的通信;
使用Activity.runOnUIThread(Runnable runnable);
使用View.post(Runnable runnable);
使用View.postDelayed(Runnable runnable, long time)。

这四种方法都使得编程较为繁琐,而AsyncTask是异步任务能够简化这些操作,适用于简单的异步处理,而不需要借助线程和Handler。
二、AsyncTask的基本知识
1. 三种参数类型
AsyncTask<>是抽象类,一般用于被继承,继承时需要指定三个参数,AsyncTask<Params,Progress, Result>,是三种泛型类型:
a. Params是启动任务执行的输入参数类型;
b. Progress是后台任务完成的进度值的类型,如进度百分比;
c. Result是后台任务完成后的返回值类型。
2. 使用AsyncTask
使用AsyncTask只需要三个步骤:
a. 继承AsyncTask,指定三个参数,如果泛型参数不需要指定,则可以设置为Void,如:
public class DownloadTask extends AsyncTask<Uri,Integer,String> {
...
}
b. 根据业务需求,重写AsyncTask的方法,AsyncTask方法如下:
1)doInBackground(Params ...):会在单独的后台线程中执行方法中的任务,是必须实现的方法,该方法 可以调用publishProgress(Progress.. value)来更新任务进度;
2)onProgressUpdate(Progress...):在doInBackground()方法调用publishProgress(Progress.. value)更 新任务进度之后将会自动调用该方法;如果在doInBackground()方法中没有调用publishProgress()方 法,则不会调用该方法;
3)onPreExecute():在doInBackground()方法调用之前被自动调用,即在耗时任务之前调用,主要用于 完成初始化,如现实进度条;
4)onPostExecute(Result...):当doInBackground()方法完成之后系统会自动调用该方法,并将 doInBackground()的返回值作为该方法的输入参数。
以上四个方法均不需要设计人员手工调用,系统会自动调用。除了doInBackground()方法以外,其他方法均能更新UI组件。以上方法并不是都要实现,但是至少实现doInBackground()方法和onPostExecute()方法。
c. 实例化AsyncTask的之类,并调用execute(Params ... params)方法,开始执行耗时任务。
3. 使用AsyncTask应该遵守的规则:
a. 必须在UI线程中创建AsyncTask之类实例;
b. 必须在UI线程中调用AsyncTask的execute方法;
c.doInBackground(Params ...)、onProgressUpdate(Progress...)、onPreExecute()和onPostExecute (Result...)这些方法不能由程序员自己调用,Android系统会自动调用;
d. 每个AsyncTask只能被执行一次,多次调用将会引发异常。
4.方法执行过程

参考资料:
1. 李刚 .疯狂Android讲义 :电子工业出版社 ,2013 :220-221 .
AsyncTask 简要介绍的更多相关文章
- 0-Broadcast机制原理简要介绍
Broadcast机制简要介绍 来源: http://blog.csdn.net/luoshengyang/article/details/6730748 导语 广播机制在Android系统中,也不算 ...
- 简要介绍BASE64、MD5、SHA、HMAC几种方法。
加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了. 言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书. ...
- [转]Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划
转自:Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划 前面我们从Android应用程序与SurfaceFlinger服务的关系出发,从侧面简单学习了Surfa ...
- [转] Android资源管理框架(Asset Manager)简要介绍和学习计划
转自:http://blog.csdn.net/luoshengyang/article/details/8738877 Android应用程序主要由两部分内容组成:代码和资源.资源主要就是指那些与U ...
- Activity启动过程简要介绍
无论是通过点击应用程序图标来启动Activity,还是通过Activity内部调用startActivity接口来启动新的Activity,都要借助于应用程序框架层的ActivityManagerSe ...
- Android应用程序的Activity启动过程简要介绍和学习计划
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6685853 在Android系统中,Activ ...
- Dalvik虚拟机简要介绍和学习计划
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8852432 我们知道,Android应用程序是 ...
- Android资源管理框架(Asset Manager)简要介绍和学习计划
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8738877 Android应用程序主要由两部分 ...
- Android应用程序组件Content Provider简要介绍和学习计划
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6946067 在Android系统中,Conte ...
随机推荐
- 在 CentOS7 上配置 nginx 虚拟主机
创建配置文件保存目录,其中 sites-available 用来实际保存配置文件,sites-enabled 用来保存符号链接 : mkdir /etc/nginx/sites-available m ...
- Java工具类使用注意事项
(以下摘自阿里巴巴Java开发手册) 1. [强制]获取单例对象需要保证线程安全,其中的方法也要保证线程安全. 说明:资源驱动类.工具类.单例工厂类都需要注意. 5. [强制]SimpleDateFo ...
- php中的form表单
表单处理 表单的概念在生活中很常见,就像是问卷调查表一样,别人先把问卷发给你,你照着问卷的要求填写,完事过后再将填完的问卷发给别人,从而达到一个将别人需要的信息传递给别人的一种方式. 传统的网页大多数 ...
- 用Js写贪吃蛇
使用Javascript做贪吃蛇小游戏, 1.自定义地图宽高,蛇的初始速度 2.食物随机出现 3.蛇的样式属性 4.贪吃蛇玩法(吃食物,碰到边界,吃食物后加速,计分,) <!DOCTYPE ht ...
- 巴塞尔问题(Basel problem)的多种解法——怎么计算$\frac{1}{1^2}+\frac{1}{2^2}+\frac{1}{3^2}+\cdots$ ?
(PS:本文会不断更新) $\newcommand\R{\operatorname{Res}}$ 如何计算$\zeta(2)=\frac{1}{1^2}+\frac{1}{2^2}+\frac{1}{ ...
- 配置监听器 服务器启动时 检索常用数据 保存在application中 减少数据的查询操作(OA项目)
模型 大致介绍一下:左侧菜单是用户登录成功之后显示的页面 这些数据就是通过查询数据库 然后在页面中把查到的数据 循环遍历出来 构成了操作菜单 第一个解决的问题:常用数据 在服务器启动的时候 ...
- http协议各版本的区别
HTTP(Hypertext transfer protocol)超文本传输协议,是一个应用层的通信协议. HTTP协议版本介绍: HTTP/0.9 :只接受GET一种请求方法,没有在通信中指定版本号 ...
- xml00
<?xml verson="1.0" encoding="ISO-8859-1"?> xml声明<note> <to>jon ...
- 自己定义View实现水平滚动控件
前几天项目中须要使用到一个水平可滚动的选择条,类似下图效果(图片是从简书上一位作者那儿找来的,本篇也是在这位作者的文章的基础上改动的,站在大神的肩膀上,哈哈,因为原文没有提供demo,并且实现的效果跟 ...
- c13--数组
// // main.c // 进制查表法 // // Created by xiaomage on 15/6/10. // Copyright (c) 2015年 xiaomage. All rig ...