Android异步任务工具类_AsyncTask 详解

AsyncTask即异步任务的封装类, 这个类能够方便的在后台执行任务<子线程>并回调结果给主线程来执行UI操作. 能够替代Thread和Handler进行一般的线程切换任务.

注意: 如果你需要在后台长时间执行操作, 官方推荐使用Executor, ThreadPoolExecutor and FutureTask.

参考文档:

演示

AsyncTask属于抽象类, 所以在使用的时候需要继承AsyncTask.

该类有三个参数的泛型需要指定

1
public abstract class AsyncTask<Params, Progress, Result>

分别为

  1. Params 参数
  2. Progress 进度
  3. Result 结果

该类有一个doInBackground()抽象方法强制重写

1
2
3
4
5
6
7
8
9
10
11
public class DownLoadTask extends AsyncTask<List, Integer, Boolean> {
/**
* 该方法处于子线程
* @param params 泛型指定
* @return 泛型指定
*/
@Override
protected Boolean doInBackground(List... params) {
return null;
}
}

可以看到泛型指定了返回值,传入参数

这里我讲下所有可重写的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class DownLoadTask extends AsyncTask<Void, Integer, Boolean> {
/**
* 该方法处于子线程
*
* @param params
* @return
*/
@Override
protected Boolean doInBackground(Void... params) {
publishProgress(6); // 这里的参数由第二个泛型指定, 直接将进度传给onProgressUpdate
return null;
}
/**
* 任务开始执行时回调
* 该方法处于主线程, 例如可以进行对话框显示
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
}
/**
* 当doInBackGround执行完毕后回调该方法
* 该方法处于主线程, 例如可以对进度条进行关闭操作
*
* @param aBoolean 由第三个泛型指定
*/
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
}
/**
* publishProgress调用该方法
* 该方法处于主线程, 可以通过进度信息来更新UI
*
* @param values 接受到传入进度
*/
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}
}

最后是执行该任务

1
new DownLoadTask().execute();

API介绍

得到当前AsyncTask的状态

1
AsyncTask.Status getStatus ()

Status这个枚举有三个值:

  1. FINISHED 完成状态
  2. PENDING 未执行状态
  3. RUNNING 正在执行状态

结束线程

该方法并不能结束当前任务, 而是在doInBackground()方法return;之后回调方法onCancelled(), 本来应该回调的方法onPostExcute()并不会执行了.

1
boolean cancel (boolean mayInterruptIfRunning)

可以通过以下方法在doInBackgroud()中做判断, 是否被cancelled. 如果返回true则return;

1
boolean isCancelled ()

如果任务被cancelled执行以下两个回调方法

1
2
void onCancelled () // 该方法其实就是执行下面的这个
void onCancelled (Result result)

得到结果

在后台任务执行完毕后可以通过该方法得到其结果. 结果类型由我前面说的泛型指定

1
Result get ()

多线程执行

在android3.0后AsyncTask只能一次执行一个子线程任务, 如果想执行多个线程任务需要自己手动添加线程池.

1
2
AsyncTask<Params, Progress, Result> executeOnExecutor (Executor exec,
Params... params)