当Android的UI线程超过5s未响应时,系统会引发ANR(Application Not Responding)异常,所以一般不在UI线程中执行耗时任务。一般是在其他线程中处理耗时任务,然后及时更新UI界面。AsyncTask是异步任务,能够更简单地解决此类问题。

一、为什么使用AsyncTask

  为了避免在Android的主线程(UI线程)中处理耗时任务,通常是要建立一个新线程来处理耗时任务。但是,有时候我们需要一边处理任务一边及时更新UI组件,而问题出现了,非UI线程不能直接更新UI组件。Android为此提供了几种解决方法:

  1. 使用Handler实现线程之间的通信;

  2. 使用Activity.runOnUIThread(Runnable runnable);

  3. 使用View.post(Runnable runnable);

  4. 使用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 简要介绍的更多相关文章

  1. 0-Broadcast机制原理简要介绍

    Broadcast机制简要介绍 来源: http://blog.csdn.net/luoshengyang/article/details/6730748 导语 广播机制在Android系统中,也不算 ...

  2. 简要介绍BASE64、MD5、SHA、HMAC几种方法。

    加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了.     言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书.     ...

  3. [转]Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划

    转自:Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划 前面我们从Android应用程序与SurfaceFlinger服务的关系出发,从侧面简单学习了Surfa ...

  4. [转] Android资源管理框架(Asset Manager)简要介绍和学习计划

    转自:http://blog.csdn.net/luoshengyang/article/details/8738877 Android应用程序主要由两部分内容组成:代码和资源.资源主要就是指那些与U ...

  5. Activity启动过程简要介绍

    无论是通过点击应用程序图标来启动Activity,还是通过Activity内部调用startActivity接口来启动新的Activity,都要借助于应用程序框架层的ActivityManagerSe ...

  6. Android应用程序的Activity启动过程简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6685853 在Android系统中,Activ ...

  7. Dalvik虚拟机简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8852432 我们知道,Android应用程序是 ...

  8. Android资源管理框架(Asset Manager)简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8738877 Android应用程序主要由两部分 ...

  9. Android应用程序组件Content Provider简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6946067 在Android系统中,Conte ...

随机推荐

  1. 邓_ Php·面试

    1:PHP的意思,它能干什么?       PHP是一个基于服务端来创建动态网站的脚本语言,您可以用PHP和HTML生成网站主页,英文的全称(Professional Home Pages)1.Web ...

  2. 机房工程-在线式、后备式UPS选择(转载)

    原文网址:http://oa.yesky.com/10/31061510all.shtml#p31061510 1后备式UPS还是在线式UPS? 作为机房设备的一项重要保护措施,UPS起着无可替代的作 ...

  3. BA--关于江森的学习笔记

    机房功率密度:“每机架”功耗 数据中心效率:平均 PUE 2.5,百度是1.36,苹果是1.06 绿色数据中心:PUE<1.58 机房环境:空气质量,配电,UPS,空气处理系统,发电机,江森OD ...

  4. [Angular] ngx-formly (AKA angular-formly for Angular latest version)

    In our dynamic forms lessons we obviously didn’t account for all the various edge cases you might co ...

  5. 多校第二场 1004 hdu 5303 Delicious Apples(背包+贪心)

    题目链接: 点击打开链接 题目大意: 在一个周长为L的环上.给出n棵苹果树.苹果树的位置是xi,苹果树是ai,苹果商店在0位置,人的篮子最大容量为k,问最少做多远的距离可以把苹果都运到店里 题目分析: ...

  6. JAVA学习第五十一课 — IO流(五)流的操作基本规律

    转换流: InputStreamReader:字节到字符的桥梁.解码 OutputStreamWriter:字符到字节的桥梁.编码 流的基本规律 1.明白源和汇 源:InputStream.Reade ...

  7. Jmeter简单应用

    JMeter 是Apache组织的开源项目,是一个纯Java桌面应用,用于压力测试和性能测量. 1.安装jmeter jdk1.6以上下载地址:http://www.oracle.com/techne ...

  8. tensorflow利用预训练模型进行目标检测(一):安装tensorflow detection api

    一.tensorflow安装 首先系统中已经安装了两个版本的tensorflow,一个是通过keras安装的, 一个是按照官网教程https://www.tensorflow.org/install/ ...

  9. 2016 提高组c++ 错题

    需重做 树的重心 链表 计算机基础知识 无线通讯技术: 蓝牙,wifi,GPRS 现在常用的无线通信技术:FM调频广播(用于收音机): 2G.3G移动通信技术(中国移动.中国联通.中国电信正在运营的网 ...

  10. Django迁移到mysql数据库时的错误

    pip install mysqlclient Collecting mysqlclient Using cached https://files.pythonhosted.org/packages/ ...