Android中异步类AsyncTask的理解
这里有两种解释的方法,各有侧重点:
第一种解释:
Async Task 简介:
AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦
AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
Params 启动任务执行的输入参数,比如HTTP请求的URL。
Progress 后台任务执行的百分比。
Result 后台执行任务最终返回的结果,比如String。
AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。
1) 子类化Async1Task
2) 实现AsyncTask中定义的下面一个或几个方法
onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。
doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread.
为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
1) Task的实例必须在UI thread中创建
2) execute方法必须在UI thread中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法
4) 该task只能被执行一次,否则多次调用时将会出现异常
doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第三个为doInBackground返回和onPostExecute传入的参数。
需要说明AsyncTask不能完全取代线程,在一些逻辑较为复杂或者需要在后台反复执行的逻辑就可能需要线程来实现了。
第二种解释:
AsyncTask抽象出后台线程运行的五个状态,分别是:1、准备运行,2、正在后台运行,3、进度更新,4、完成后台任务,5、取消任务,对于这五个阶段,AsyncTask提供了五个回调函数:
1)准备运行:onPreExecute(),该回调函数在任务被执行之后立即由UI线程调用。这个步骤通常用来建立任务,在用户接口(UI)上显示进度条。
2)正在后台运行:doInBackground(Params...),该回调函数由后台线程在onPreExecute()方法执行结束后立即调用。通常在这里执行耗时的后台计算。计算的结果必须由该函数返回,并被传递到onPostExecute()中。在该函数内也可以使用publishProgress(Progress...)来发布一个或多个进度单位(unitsof progress)。这些值将会在onProgressUpdate(Progress...)中被发布到UI线程。
3)进度更新:onProgressUpdate(Progress...),该函数由UI线程在publishProgress(Progress...)方法调用完后被调用。一般用于动态地显示一个进度条。
4)完成后台任务:onPostExecute(Result),当后台计算结束后调用。后台计算的结果会被作为参数传递给这一函数。
5)取消任务:onCancelled (),在调用AsyncTask的cancel()方法时调用
AsyncTask的构造函数有三个模板参数:
(1)Params,传递给后台任务的参数类型。
(2)Progress,后台计算执行过程中,进步单位(progress units)的类型。(就是后台程序已经执行了百分之几了。)
(3)Result, 后台执行返回的结果的类型。
AsyncTask并不总是需要使用上面的全部3种类型。标识不使用的类型很简单,只需要使用Void类型即可
第三:关于AsynTask与Handler的一些区别:
1.AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.
使用的优点:
a. 简单,快捷
b. 过程可控
使用的缺点:
a.在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来.
2. Handler异步实现的原理和适用的优缺点
在Handler 异步实现时,涉及到 Handler, Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)àthread(子线程)运行并生成Message-àLooper获取Message并传递给Handler、àHandler逐个获取Looper中的Message,并进行UI变更。
使用的优点: www.2cto.com
a.结构清晰,功能定义明确
b.对于多个后台任务时,简单,清晰
使用的缺点:
a.在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)
作者:tianfeng701
最新文章
- Office2016打开doc字符间距过小
- Entity Framework技术导游系列 开篇 (转)
- TCP发消息续传文件
- hdoj 1875 畅通工程再续
- 基础笔记(一)Java 集合
- Java基础知识强化之IO流笔记40:字符流缓冲流之特殊功能 [ newLine() / readLine() ]
- 【C++学习之路】派生类的构造函数(三)
- 《HTML5权威指南》
- Java学习笔记--脚本语言支持API
- Excel Microsoft.Jet.OLEDB.4.0 外部数据库驱动程序中(1)的意外错误
- hadoop MapReduce
- matplot绘图基本使用
- iOS 证书申请和使用详解(详细版)阅读
- Codeforces-541div2
- Device Identifier and Device DNA初识
- Linux上安装java+tomcat+mysql运行环境
- linux基础命令---umask
- Current request is not a multipart request
- Effective STL 学习笔记 Item 16:vector, string &; C API
- jquery 实现点击按钮后出现倒计时效果(用于实现发送手机验证码、邮箱验证码)
热门文章
- 【转】下载量最高的 100 个 Laravel 扩展包推荐
- your project contains error(s),please fix them before running your application.错误总结
- C# .Net实现URL绝对路径和相对路径之间互相转换
- 解决微软的两个恶心问题(VS2008死机、Win2008 WAS无法启动)
- LINQ延迟查询的例子
- JavaScript判断字符串的字符长度(中文占两个字符)
- MYSQL 中常用日期时间函数使用
- C++ 简单中文敏感词检测工具类
- .Net平台下ActiveMQ入门实例
- CodeTimer