安卓异步任务类AsyncTask——突出一个简单、好用
2015-10-23 09:38
232 查看
前言:AsyncTask是android提供的轻量级异步任务类(代码轻量级,系统资源占用并不是轻量级!),完整的封装了异步任务流程,这让我想起了Handler异步任务通信机制。两者对比起来,AsyncTask较好的封装性可以极大的减少代码量,而Handler+Thread的异步实现代码量是比较多的,但是Handler+Thread的异步实现方式对于线程的把控更精细化,代码效率会更优化一些(实际上AsyncTask对象就是基于Handler+Thread异步的封装)。在实现一些简单异步任务的时候是可以优先考虑AsyncTask,毕竟更简洁一些!
一、AsyncTask对象说明
1、实现的逻辑:
代码中直接继承AsyncTask类,内部方法doInBackground(Params…)实现异步操作,并提供接口publicProgress(Progress…)反馈当前异步执行的程度(可以通过该接口实现UI进度更新),内部方法onProgressUpdate(Progress…)处理反馈的进度信息,内部方法onPostExecute(Result)处理最终异步结果。
2、定义了三个泛型类型:Params,Progress和Result
Params 启动任务执行的输入参数。
Progress 后台任务执行过程中的反馈。
Result 后台执行任务最终返回的结果。
注:注意泛型和可变参数的使用。
3、定义的6个内部方法
doInBackground(Params…) :后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
onPostExecute(Result) : 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。此方法在主线程执行,任务执行的结果作为此方法的参数返回。
onProgressUpdate(Progress…) : 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
onPreExecute() : 这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
onCancelled() : 用户调用取消时,要执行的操作
注:doInBackground(Params…)方法必须重载,其它方法根据实际需要使用。
4、几个注意要点
a、AsyncTask的实例必须在UI thread中创建;
b、启动实例的execute方法必须在UI thread中调用;
c、不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;
d、一个AsyncTask实例只能被执行一次,多次调用时将会出现异常。
![](http://img.blog.csdn.net/20151023095127118)
AsyncTask运行示意图
二、AsyncTask异步实现代码示例
private class MyTask extends AsyncTask<Params, Progress, Result> {
//异步操作
protected Result doInBackground(Params... params) {
.....
//反馈进度
publishProgress(Progress);
.....
return Reslut;
}
//处理操作进度反馈
protected void onProgressUpdate(Progress... progress) {
....
}
//处理返回结果
protected void onPostExecute(Result result) {
....
}
}
启动异步任务:
new MyTask().execute(Params);
三、更多
本文前言已经提到了,AsyncTask异步实际上是对Handler+Thread的封装,那么具体是怎么封装实现的呢?可以参考:http://blog.csdn.net/liuhe688/article/details/6532519
如果你对安卓异步线程和消息机制不太了解,欢迎阅读我的上一篇笔记——安卓异步线程消息机制学习!
一、AsyncTask对象说明
1、实现的逻辑:
代码中直接继承AsyncTask类,内部方法doInBackground(Params…)实现异步操作,并提供接口publicProgress(Progress…)反馈当前异步执行的程度(可以通过该接口实现UI进度更新),内部方法onProgressUpdate(Progress…)处理反馈的进度信息,内部方法onPostExecute(Result)处理最终异步结果。
2、定义了三个泛型类型:Params,Progress和Result
Params 启动任务执行的输入参数。
Progress 后台任务执行过程中的反馈。
Result 后台执行任务最终返回的结果。
注:注意泛型和可变参数的使用。
3、定义的6个内部方法
doInBackground(Params…) :后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
onPostExecute(Result) : 相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。此方法在主线程执行,任务执行的结果作为此方法的参数返回。
onProgressUpdate(Progress…) : 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
onPreExecute() : 这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
onCancelled() : 用户调用取消时,要执行的操作
注:doInBackground(Params…)方法必须重载,其它方法根据实际需要使用。
4、几个注意要点
a、AsyncTask的实例必须在UI thread中创建;
b、启动实例的execute方法必须在UI thread中调用;
c、不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;
d、一个AsyncTask实例只能被执行一次,多次调用时将会出现异常。
AsyncTask运行示意图
二、AsyncTask异步实现代码示例
private class MyTask extends AsyncTask<Params, Progress, Result> {
//异步操作
protected Result doInBackground(Params... params) {
.....
//反馈进度
publishProgress(Progress);
.....
return Reslut;
}
//处理操作进度反馈
protected void onProgressUpdate(Progress... progress) {
....
}
//处理返回结果
protected void onPostExecute(Result result) {
....
}
}
启动异步任务:
new MyTask().execute(Params);
三、更多
本文前言已经提到了,AsyncTask异步实际上是对Handler+Thread的封装,那么具体是怎么封装实现的呢?可以参考:http://blog.csdn.net/liuhe688/article/details/6532519
如果你对安卓异步线程和消息机制不太了解,欢迎阅读我的上一篇笔记——安卓异步线程消息机制学习!
相关文章推荐
- swift和oc单例创建方式
- UEFI+GPT引导基础篇(一):什么是GPT,什么是UEFI?
- Longest Valid Parentheses
- 计算机图形学基础实验二(DDA算法实现 稍加控制)
- 在Servlet中获取Spring的指定bean
- Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完成测试代码)
- configure: error: C compiler cannot create executables编译错误的解决办法的思路分析
- JS类库收罗
- [设计模式]策略模式
- 关于 java,nio,bufferedreader,bytebuffer
- java keytool证书工具使用小结
- 如何在linux下实现mysql数据库每天自动备份
- AFNetworking 3.0迁移指南
- 美国媒体英语新闻
- Android Fragment应用实战
- 利用循环求和:三种循环语句
- window.open
- 没有谋略是不行的
- What’s New in MySQL 5.7? (Generally Available)
- Oracle查找表的外键引用关系