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 ...
随机推荐
- J2EE异常问题总结
http://blog.csdn.net/rchm8519/article/details/41624381 http://www.51testing.com/html/49/240349-14393 ...
- jqury+animation+setTimeOut实现渐变显示与隐藏动画
初始效果 实现效果 1,编写HTMl结构代码 <div class="box"> <i class="icon"></i> ...
- [ASP.NET]EF跨项目调用问题
在一个项目中调用另一个项目中的模型,在该项目中添加一个模型,解决自动提示问题using问题
- hdu 5335 Walk Out (2015 Multi-University Training Contest 4)
Walk Out Time Limit: 2000/10 ...
- Cocos2d-x 2.2.3 使用NDK配置安卓编译环境问题之 Cannot find module with tag 'CocosDenshion/android' in import path
1.当做安卓移植的时候遇到例如以下问题: Android NDK: jni/Android.mk: Cannot find module with tag 'CocosDenshion/android ...
- Agile实践日志一 -- Grooming Session
Agile实践日志一 -- Grooming Session GroomingSession 这个Session主要Go through我们下一个Sprint须要做的Story,大家都清楚之后,在每 ...
- BZOJ:3441 乌鸦喝水
bzoj:3441 乌鸦喝水 题目传送门 Description 一只乌鸦在自娱自乐,它在面前放了n个有魔力的水缸,水缸里装有无限的水. 他准备从第1个水缸飞到第n个水缸,共m次.在飞过一个水缸的过程 ...
- AMD cpu 下 Pytorch 多卡并行卡死问题解决
dataparallel not working on nvidia gpus and amd cpus https://github.com/pytorch/pytorch/issues/130 ...
- 如何用写js弹出层 ----2017-03-29
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Qt-信号和槽-1对1
前言:信号和槽是Qt的核心机制,窗体和控件对象之间的沟通一般都使用信号和槽. 对于部件有哪些信号和槽,可以查看help文档. 一.使用自定义槽 1.1 新建工程 新建工程,新建Widget类(基于QW ...