Android开发之异步具体解释(二)之AsyncTask
请尊重他人的劳动成果,转载请注明出处:Android开发之异步具体解释(二)之AsyncTask
http://blog.csdn.net/fengyuzhengfan/article/details/40212745
我曾在《Android开发之异步具体解释(一)之Thread+Handler》一文中介绍过通过Thread+Handler实现异步操作。感兴趣的朋友能够看一下。
尽管Thread+Handler能够实现更新主线程的UI并实现异步,但Thread+Handler模式须要为每个任务创建一个新的线程,任务完毕后通过Handler实例向UI线程发送消息,完毕界面的更新,这样的方式对于整个过程的控制比較精细,但也是有缺点的,比如代码繁琐,在多个任务同一时候运行时,不易对线程进行精确的控制。
以下就介绍一下Android中AsyncTask的使用:
AsyncTask简单介绍:
从Android 1.5開始系统将AsyncTask引入到android.os包中。AsyncTask,是android提供的轻量级的异步类,能够直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步运行的程度(能够通过接口实现UI进度更新),最后反馈运行的结果给UI主线程。
类概述:
AsyncTask的出现使得使用UI线程变得轻巧而简单。这个类同意运行后台操作,并将操作结果更新到UI线程上而无需操作threads和handlers。
AsyncTask的设计是环绕线程和Handler一个辅助类,并不构成一个通用线程框架。异步任务最好应採用短作业。假设你须要保持执行非常长一段时间的线程,能够使用java.util.concurrent包等提供的ThreadPoolExecutor和FutureTask等各种API来替代。
异步任务被定义执行在后台线程和要公布结果在UI线程上的一个运算。 异步任务被定义为Params,Progress和Result
3通用 类型,和onPreExecute,doInBackground,onProgressUpdate和onPostExecute
4个步骤。
AsyncTask的定义
AsyncTask的定义了三种泛型类型 Params,Progress和Result。
public abstract class AsyncTask<Params, Progress, Result>
Params 启动任务运行的输入參数,比方HTTP请求的URL。
Progress 后台任务运行的进度。
Result 后台运行任务终于返回的结果,比方String。
AsyncTask中主要方法介绍:
onPreExecute() ,该方法将在运行实际的后台操作前被UI 线程调用。能够在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化,这种方法能够不用实现。
doInBackground(Params...) ,将在onPreExecute 方法运行后立即运行,该方法运行在后台线程中。这里将主要负责运行那些非常耗时的后台处理工作。能够调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
onProgressUpdate(Progress...),在 publishProgress(Progress...)方法被调用后,UI
线程将调用这种方法从而在界面上展示任务的进展情况,比如通过一个进度条进行展示。
onPostExecute(Result),在doInBackground 运行完毕后,onPostExecute方法将被UI 线程调用,后台的计算结果将通过该方法传递到UI 线程,而且在界面上展示给用户。
onCancelled(),在用户取消线程操作的时候调用。在主线程中调用onCancelled()的时候调用。
使用AsyncTask的步骤
AsyncTask同意你在你的用户界面上运行异步操作。它在一个子线程中运行耗时的操作,然后在UI线程上公布运行结果,而不须要你来处理Thread和Handler。
要使用AsyncTask,你必须继承AsyncTask和实现doInBackground()回调方法,AsyncTask执行在后台的一个线程池中。若要更新你的UI,你应该实现onPostExecute()方法,它从doInBackground()方法中获取的结果,并执行在UI线程中,这样你就能够安全地更新你的UI。你能够在UI线程中调用execute()方法開始你任务。
使用AsyncTask的步骤:
1)创建一个继承AsyncTask的类
2) 实现AsyncTask中定义的抽象方法doInBackground(Params...),然后依据须要重写它的其他方法。
3) 调用execute()来開始任务。
看一个样例:
// <String,Integer, Bitmap>
// 表示从调用位置传来的參数
// Integer:表示读取网络数据的进度
// 从网络返回的值
class NetTask extends AsyncTask<String, Integer, Bitmap> {
private String path;
private ImageView iv; public NetTask(String path, ImageView iv) {
this.path = path;
this.iv = iv;
} // 主线程中,反馈网络訪问进度
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
Log.i("NetUtil", "values=" + values[0]);
} // 主线程中,子线程运行之前运行
@Override
protected void onPreExecute() {
super.onPreExecute();
} // 子线程
@Override
protected Bitmap doInBackground(String... params) {
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
// 设置一些连接属性
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");// POST
// 设置http头信息
//conn.setRequestProperty("Content-type", newValue)
if (conn.getResponseCode() == 200) {
InputStream is = conn.getInputStream();
return BitmapFactory.decodeStream(is);
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
} // 在主线程中,网络返回数据时运行
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
if (result != null) {
iv.setImageBitmap(result);
}
}
}
注意事项:
为了正确的使用AsyncTask类,下面是几条必须遵守的准则:
1) AsyncTask的实例必须在UI 线程中创建。
2) execute方法必须在UI 线程中调用。
3) 不要手动的调用onPreExecute(),onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法,须要在UI线程中实例化这个AsyncTask来调用。
4) 该AsyncTask仅仅能被运行一次,否则多次调用时将会出现异常。
5) doInBackground方法和onPostExecute的參数必须相应,这两个參数在AsyncTask声明的泛型參数列表中指定,第一个为doInBackground接受的參数,第二个为显示运行进度的參数,第第三个为doInBackground返回和onPostExecute传入的參数。
Thread+Handler模式与AsyncTask的优缺点:
AsyncTask实现的原理和适用的优缺点:
AsyncTask,是android提供的轻量级的异步类,能够直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步运行的程度(能够通过接口实现UI进度更新),最后反馈运行的结果给UI主线程.
使用的长处:
1) 简单,快捷
2) 过程可控
使用的缺点:
1) 在使用多个异步操作和并须要进行Ui变更时,就变得复杂起来.
Handler异步实现的原理和适用的优缺点:
在Handler 异步实现时,涉及到 Handler,Looper, Message,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)执行并生成Message-Looper获取Message并传递给HandlerHandler逐个获取Looper中的Message,并进行UI变更。
使用的长处:
1) 结构清晰,功能定义明白
2) 对于多个后台任务时,简单,清晰
使用的缺点:
1) 在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)
最后须要说明AsyncTask不能全然代替线程,在一些逻辑较为复杂或者须要在后台重复运行的逻辑就可能须要Thread+Handler来实现了。
假设你认为这篇博文对你有帮助的话,请为这篇博文点个赞吧!也能够关注fengyuzhengfan的博客,收看很多其它精彩!http://blog.csdn.net/fengyuzhengfan/
Android开发之异步具体解释(二)之AsyncTask的更多相关文章
- Android开发艺术探索笔记——View(二)
Android开发艺术探索笔记--View(二) View的事件分发机制 学习资料: 1.Understanding Android Input Touch Events System Framewo ...
- Android开发8:数据存储(二)——SQLite数据库和ContentProvider的使用
前言 啦啦啦各位小伙伴们许久不见了~学期末和过年期间自己忙着做其他事没能及时更新Android开发系列课程的博客,实在是罪过罪过~ 好啦~废话不多说,进入我们今天的主题.今天我们将和大家学习其他的数据 ...
- Android开发中遇到的问题(二)——新建android工程的时候eclipse没有生成MainActivity和layout布局
一.新建android工程的时候eclipse没有生成MainActivity和layout布局 最近由于工作上的原因,开始学习Android开发,在入门的时候就遇到了不少的坑,遇到的第一个坑就是&q ...
- Android开发——Fragment知识整理(二)
0. 前言 Android开发中的Fragment的应用非常广泛,在Android开发--Fragment知识整理(一)中简单介绍了关于Fragment的生命周期,常用API,回退栈的应用等知识.这 ...
- Android开发之异步消息处理机制Handler
更加详细的介绍Handler的博文-http://blog.csdn.net/guolin_blog/article/details/9991569 Android中的异步消息处理主要有四个部分组成, ...
- Android开发——进程间通信之AIDL(二)
0. 前言 不论是Android还是其它操作系统.都会有自己的IPC机制.所谓IPC(Inter-Process Communication)即进程间通信.首先线程和进程是非常不同的概念,线程是CP ...
- 三年Android开发,月薪一万二,不敢跳槽,每天都很焦虑
在我们的身边,存在一个普遍现象:很多人从事Android开发工作多年,走过的弯和坎,不计其数,经历的心酸难与外人道也.可是技术确难以提升.止步不前,薪资也只能看着别人水涨船高,自己却没有什么起色. 虽 ...
- Android开发之异步获取并下载网络资源-下载图片和下载文本内容
在android网络开发过程中,经常需要获取网络资源,比如下载图片,下载文本文件内容等,这个时候就需要http请求来获取相应的网络资源.首先看看实例效果图: 下载图片截图 ...
- Android开发之蓝牙(Bluetooth)操作(二)--修改本机蓝牙设备的可见性,并扫描周围可用的蓝牙设备
版权声明:本文为博主原创文章,未经博主允许不得转载. 一. 修改本机蓝牙设备的可见性 二. 扫描周围可用的蓝牙设备 Eg: 一. 清单文件AdroidManifest.xml: <?xml v ...
随机推荐
- Red Gate系列之二 SQL Source Control 3.0.13.4214 Edition 数据库版本控制器 完全破解+使用教程
原文:Red Gate系列之二 SQL Source Control 3.0.13.4214 Edition 数据库版本控制器 完全破解+使用教程 Red Gate系列之二 SQL Source Co ...
- VS2012的变态优化,双循环变单循环
VS2010也是一样
- ROW_NUMBER() OVER 排序函数的基本用法
ROW_NUMBER() OVER 排序函数 select ROW_NUMBER() OVER (PARTITION BY guide_id ORDER BY pic_sort) as rowid,p ...
- [转载][NAS] 使用win8的“存储池”功能~
之前自己用DQ77KB搭建一个小存储系统(帖子链接:http://www.chiphell.com/thread-567753-1-1.html),一直使用intel主板带的软RAID功能构建RAID ...
- Jenkins详细安装与构建部署使用教程(转)
Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能.Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括:1.持续的软件版本发布 ...
- C++面试宝典2011版
1.new.delete.malloc.free关系 delete会调用对象的析构函数,和new相应free仅仅会释放内存,new调用构造函数.malloc与free是C++/C语言的标准库函数,ne ...
- WF系列——工作流基本知识
工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档.信息或任务的过程自动进行,从而实现某个预期的业务目标 ...
- JAVA基础编程50题(10-12题)具体解释
一.描写叙述 1.一球从m米高度自由落下.每次落地后反跳回原高度的一半:再落下,求它在 第n次落地时.共经过多少米?第10次反弹多高? 2.有1.2.3.4个数字.能组成多少个互不同样且无反复数字的三 ...
- Nexon由Xsolla全球支付服务
韩国游戏公司纳克森决Nexon定从今年10月1日起,与Xsolla开展Playspan的合作,向全球提供更好的服务. 当Nexon的玩家随时想购买NX点数的时候.Xsolla的服务能够进入程序,让您的 ...
- 非对称加密算法RSA使用注意事项
原文:非对称加密算法RSA使用注意事项 第一个问题,也是最重要的一个——RSA无法对超过117字节的数据进行加密!切记!其实也勿需要求对更大数据的加密,虽然网上已经有相关解决方案,比如BigInteg ...