Android 中文 API (101) —— AsyncTask
public abstract class AsyncTask extends Object
java.lang.Object
android.os.AsyncTask<Params, Progress, Result>
二、类概述
AsyncTask能够适当地、简单地用于 UI线程。 这个类不需要操作线程(Thread)就可以完成后台操作将结果返回UI。
异步任务的定义是一个在后台线程上运行,其结果是在 UI线程上发布的计算。 异步任务被定义成三种泛型类型: Params,Progress和 Result;和四个步骤: begin , doInBackground,processProgress 和end。
三、用法
doInBackground(Params...)
),最经常覆盖另一个(onPostExecute(Result)
.)下面是一个子类的例子:private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
}
return totalSize;
} protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
} protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
一旦创建,一个任务执行起来就非常简单:
new DownloadFilesTask().execute(url1, url2, url3);
四、AsyncTask的泛型类型
这三个类型被用于一个异步任务,如下:
1. Params,启动任务执行的输入参数
2. Progress,后台任务执行的百分比
3. Result,后台计算的结果类型
在一个异步任务里,不是所有的类型总被用。假如一个类型不被使用,可以简单地使用 Void
类型:
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
五、4个步骤
当一个异步任务被执行,任务经过四各步骤:
1.onPreExecute()
,在UI线程上调用任务后立即执行。这步通常被用于设置任务,例如在用户界面显示一个进度条。
2.doInBackground(Params...)
,后台线程执行onPreExecute()完后立即调用,这步被用于执行较长时间的后台计算。异步任务的参数也被传到这步。计算的结果必须在这步返回,将传回到上一步。在执行过程中可以调用publishProgress(Progress...)
来更新任务的进度。
3.onProgressUpdate(Progress...)
,一次呼叫 publishProgress(Progress...)
后调用 UI线程。执行时间是不确定的。这个方法用于当后台计算还在进行时在用户界面显示进度。例如:这个方法可以被用于一个进度条动画或在文本域显示记录。
4.onPostExecute(Result)
, 当后台计算结束时,调用 UI线程。后台计算结果作为一个参数传递到这步。
六、线程规则
有一些线程规则必须去遵守,这个类才会正确的工作:
任务实例必须创建在 UI线程
execute(Params...)
必须在UI线程上调用
不要手动调用
onPreExecute()
, onPostExecute(Result)
, doInBackground(Params...)
, onProgressUpdate(Progress...)
这个任务只执行一次(如果执行第二次将会抛出异常)
七、内部类
enum AsyncTask.Status
表示任务的当前状态
八、构造函数
public AsyncTask ()
创建一个新的异步任务。这个构造函数必须在UI线程上调用。
九、公共方法
public final boolean cancel (boolean mayInterruptIfRunning)
尝试取消这个任务的执行,如果这个任务已经结束或者已经取消或者不能被取消或者某些其他原因,那么将导致这个操作失败,当调用此方法时,此方法执行成功并且这个任务还没有执行,那么此任务将不再执行。如果任务已经开始,这时执行此操作传入的参数mayInterruptIfRunning为true,执行此任务的线程将尝试中断该任务。
参数
mayInterruptIfRunning 如果为true则正在执行的线程将会中断,如果false,则会允许正在执行的任务线程执行完毕。
返回值
如果此任务不能取消返回false,如果已经正常的执行完毕,返回true
参见
public final AsyncTask<Params, Progress, Result> execute (Params... params)
用指定的参数来执行此任务,这个方法将会返回此任务本身,所以调用者可以拥有此任务的引用。此方法必须在UI线程中调用
参数
params 任务参数
返回值
AsyncTask的实例
异常
IllegalStateException 如果getStatus()返回的是RUNNING或者FINISHED
public final Result get ()
等待计算结束并返回结果
返回值
计算结果
异常
CancellationException 如果计算取消
ExecutionException 如果计算抛出异常
InterruptedException 当等待时当前线程抛出异常
public final Result get (long timeout, TimeUnit unit)
等待计算结束并返回结果,最长等待时间为:timeOut(超时时间).
参数
timeout 计算等待超时时间
unit 超时的时间单位
返回值
计算结果
异常
CancellationException 如果计算取消
ExecutionException 如果计算抛出异常
InterruptedException 当等待时当前线程抛出异常
TimeoutException 等待时间超时
public final AsyncTask.Status getStatus ()
获得任务的当前状态
返回值
当前状态
public final boolean isCancelled ()
如果在任务正常结束之前取消任务成功则返回true,否则返回false
返回值
如果任务正常结束之前取消任务成功返回true。
参见
十、受保护方法
protected abstract Result doInBackground (Params... params)
覆盖此方法在后台线程执行计算,此方法中的参数是此任务的execute(Params...)
方法的调用这传递的参数,此方法可以调用publishProgress(Progress...)在
UI线程中来更新数据
参数
params 此任务的参数
返回值
返回一个由此任务子类定义的结果 Result
参见
protected void onCancelled ()
此方法在UI线程中当cancel(boolean)
被调用后调用
参见
protected void onPostExecute (Result result)
此方法在UI线程中doInBackground(Params...)
。方法调用之后调用,此方法中的参数的值是doInBackground(Params...)
的返回值或者当此任务已经被取消或有异常发生时此参数值为空
null
参数
result 由doInBackground(Params...)
计算出的操作的结果。
参见
protected void onPreExecute ()
在方法doInBackground(Params...)
调用之前调用
参见
protected void onProgressUpdate (Progress... values)
该方法在UI线程中publishProgress(Progress...)
被调用之后调用,该方法中的参数
values是已经被传递到
publishProgress(Progress...)
中的参数
参数
values 进度表示值
参见
protected final void publishProgress (Progress... values)
当调用doInBackground(Params...)
在后台执行计算时会调用该方法,每当在UI线程中调用此方法时将触发onProgressUpdate(Progress...)
方法的执行
参数
values 将进度值更新到UI
参见
十一、补充
文章精选
TabActivity下在AsyncTask中使用ProgressDialog存在问题的解决方法
小心,AsyncTask 不是萬能的[blogspot]
十二、公告
内部类、内部接口由于内容较少均不再单独发布。
结束
随着春节的结束,翻译组工作重新回到正轨,感谢大家的关注与支持!
——————————————————————————————————————————
一、结构
public static final enum AsyncTask.Status extends Enum<E extends Enum<E>>
java.lang.Object
java.lang.Enum<E extends java.lang.Enum<E>>
android.os.AsyncTask.Status
二、类概述
三、枚举值
public static final AsyncTask.Status FINISHED
标志onPostExecute(Result)
方法已经结束
public static final AsyncTask.Status PENDING
标志任务还没有执行
转载:
Android中文翻译组:http://goo.gl/6vJQl
标志任务正在执行
Android 中文 API (101) —— AsyncTask的更多相关文章
- Android 中文 API (40) —— RatingBar
Android 中文 API (40) —— RatingBar 前言 本章内容是 android.widget.RatingBar,译为"评分条",版本为Android 2.2 ...
- Android 中文API (70) —— BluetoothDevice[蓝牙]
前言 本章内容是 android.bluetooth.BluetoothDevice,为Android蓝牙部分的章节翻译.蓝牙设备类,代表了蓝牙通讯国足中的远端设备.版本为 Android 2.3 ...
- Android 中文API (69) —— BluetoothAdapter[蓝牙]
前言 本章内容是 android.bluetooth.BluetoothAdapter,为Android蓝牙部分的章节翻译.本地蓝牙设备的适配类,所有的蓝牙操作都要通过该类完成.版本为 Androi ...
- Android 中文API (68) —— BluetoothClass.Service
前言 本章内容是 android.bluetooth.BluetoothClass.Service,为Android蓝牙部分的章节翻译,版本为 Android 2.3 r1,翻译来自中山大学的&q ...
- Android 中文API (67) —— BluetoothClass.Device.Major
前言 本章内容是android.bluetooth.BluetoothClass.Device.Major,为Android蓝牙部分的章节翻译,版本为Android 2.3 r1,翻译来自中山大学 ...
- Android 中文API (66) —— BluetoothClass.Device
前言 本章内容是android.bluetooth.BluetoothClass.Device,为Android蓝牙部分的章节翻译,版本为Android 2.3 r1,翻译来自中山大学的" ...
- Android 中文API (65) —— BluetoothClass[蓝牙]
前言 本章内容是android.bluetooth.BluetoothClass,为Android蓝牙部分的章节翻译.用于描述远端设备的类型,特点等信息,通过getBluetoothClass()方法 ...
- android中文api(79)——Gallery
前言 本章内容是 android.widget.Gallery,版本为Android 2.3 r1,翻译来自"henly.zhang",欢迎大家访问他的博客:http://www. ...
- Android中文API
Android中文API http://www.android-doc.com/index.html
随机推荐
- shell入门-sort排序
命令:sort 选项:-t:-kn 指定根据某段来排序 这里n代表数字,范围指定n,N.从n到N范围 -n 按数字顺序排列 -r 反序排列 -u 去重复排序 -un 数字顺序排列并去重复,系 ...
- ORA-12504:tns:监听程序在 CONNECT_DATA中未获得SERVICE_NAME
在VS2008中创建一个数据源时,提示以下错误 “ORA-12504:tns:监听程序在 CONNECT_DATA中未获得SERVICE_NAME” 本机安装ORACLE客户端,找出以下路径的文件D: ...
- 【机器学习】推荐系统、SVD分解降维
推荐系统: 1.基于内容的实现:KNN等 2.基于协同滤波(CF)实现:SVD → pLSA(从LSA发展而来,由SVD实现).LDA.GDBT SVD算是比较老的方法,后期演进的主题模型主要是pLS ...
- Spring入门第五课
集合属性 在Spring中可以通过一组内置的xml标签(如:<list>,<set>,<map>)来配置集合属性. 配置java.util.List类型的属性,需要 ...
- Git merge一个branch到另一个branch
在项目开发过程中,需要merge一个branch (branch名 taskBranch) 到另一个名为develop 的branch 方法: 先保证当前停留在develop的branch上 然后执行 ...
- SuperSocket框架中BinaryRequestInfo协议的使用
一.开发环境 1.Windows 10 企业版 64位 2.Microsoft Visual Studio 2017 企业版 二.项目开始 1.新建控制台程序,项目名称“BinarySuperSock ...
- 树莓派配置(一):打开SPI
1.树莓派默认SPI关闭,在进行编程前需要打开SPI cd /boot/ sudo vi config.txt 将#dtparam=spi=off 改成:dtparam=spi=on 重启 sudo ...
- 消息队列--RabbitMQ(二)
1.常用的几种队列简介 RabbitMQ有五种常用的队列,分别是:简单队列.work模式.发布订阅模式.路由模式.主题(Topic)模式.其实发布订阅.路由.主题这三种模式都从属于与routingke ...
- Haproxy+Keepalived高可用配置
基本实验 参考文档 博文地址 环境拓扑 下面使我们要实现的负载均衡集群图示 主节点地址: 92.0.0.11 从节点地址: 92.0.0.12 共享虚拟地址:92.0.0.8 下面是负载均衡集群可能出 ...
- go语言实战教程:实战项目资源导入和项目框架搭建
从本节内容开始,我们将利用我们所学习的Iris框架的相关知识,进行实战项目开发. 实战项目框架搭建 我们的实战项目是使用Iris框架开发一个关于本地服务平台的后台管理平台.平台中可以管理用户.商品.商 ...