0%

AsyncTask

一、简介

AsyncTask是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程。
AsyncTask是对Handler与线程池的封装。使用它可以更方便之处的更新用户界面。但是它每次创建只能执行一次execute()方法,即创建一个AsyncTask只能执行一次任务,当然execute可以传入多个Params(参数)

二、相关api介绍(仅限参考,具体使用请看代码)

  1. AsyncTask必须被子类化才能使用

    1
    2
    3
    4
    5
    6
    7
    /**
    * public abstract class AsyncTask<Params, Progress, Result>
    * Params 启动任务执行的输入参数,比如HTTP请求的URL。
    * Progress 后台任务执行的百分比。
    * Result 后台执行任务最终返回的结果,比如String。
    */
    private class MyAsyncTask extends AsyncTask<Integer, Integer, String> {...}
  2. 注意

    • Task的实例必须在UI thread中创建;
    • execute方法必须在UI thread中调用;
    • 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params…), onProgressUpdate(Progress…)这几个方法;
    • 该task只能被执行一次,否则多次调用时将会出现异常;
  3. 公共方法(供外部调用的)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // 试图取消对此任务的执行。
    final boolean cancel(boolean mayInterruptIfRunning)
    // 执行具有指定Params参数的任务。
    final AsyncTask<Params, Progress, Result> execute(Params... params)
    // 便捷的版本execute(Object)以简单的Runnable对象使用,可以是:asyncTask.execute();
    static void execute(Runnable runnable)
    // 执行具有指定参数的任务。
    final AsyncTask<Params, Progress, Result> executeOnExecutor(Executor exec, Params... params)
    // 如有必要,等待至多给定的时间计算完成,然后获取其结果。
    final Result get(long timeout, TimeUnit unit)
    // 如有必要,等待计算完成,然后获取其结果。
    final Result get()
    // 返回此任务的当前状态。
    final AsyncTask.Status getStatus()
    // 返回真,如果之前正常完成这个任务被取消。
    final boolean isCancelled()
  4. 私有方法(子类实现)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 覆盖此方法可在后台线程进行计算。(必须重写)
abstract Result doInBackground(Params... params)
// 应用最好重写onCancelled(Object)。
void onCancelled()
// 在UI线程上运行之后cancel(boolean)被调用 doInBackground(Object[])已完成。
void onCancelled(Result result)
// 运行之后的UI线程上doInBackground(Params...)。
void onPostExecute(Result result)
// 之前运行在UI线程上doInBackground(Params...)。
void onPreExecute()
// 在UI线程上运行后publishProgress(Progress...)调用。
void onProgressUpdate(Progress... values)
// 这种方法可以从被调用doInBackground(Params...)到UI线程上发布更新,而后台计算仍在运行。
final void publishProgress(Progress... values)

三、示例代码

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
48
49
50
51
52
53
54
55
56
57
58
59
// 创建
MyAsyncTask asyncTask = new MyAsyncTask();
// 使用指定的Params参数执行任务
asyncTask.execute(100, 50);
---------------------------------------
private class MyAsyncTask extends AsyncTask<Integer, Integer, String> {
/**
* 这里的Integer参数对应AsyncTask中的第一个参数
* 这里的String返回值对应AsyncTask的第三个参数
* 该方法并不运行在UI线程当中,主要用于异步操作,所有在该方法中不能对UI当中的空间进行设置和修改
* 但是可以调用publishProgress方法触发onProgressUpdate对UI进行操作
*/
@Override
protected String doInBackground(Integer... params) {
int count = params.length;
Log.e(TAG, "doInBackground: " + count);
int i = 0;
for (i = 10; i <= params[0].intValue(); i += 10) {
try {
//休眠1秒
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 更新进度条(0-100)
publishProgress(i);
}
return (i - 10) + "";
}

/**
* 这里的String参数对应AsyncTask中的第三个参数(也就是接收doInBackground的返回值)
* 在doInBackground方法执行结束之后在运行,并且运行在UI线程当中 可以对UI空间进行设置
*/
@Override
protected void onPostExecute(String result) {
asyncTv.setText("异步操作执行结束" + result);
}


//该方法运行在UI线程当中,并且运行在UI线程当中可以对UI空间进行设置
@Override
protected void onPreExecute() {
asyncTv.setText("开始执行异步线程,请稍等");
}


/**
* 这里的Intege参数对应AsyncTask中的第二个参数
* 在doInBackground方法当中,,每次调用publishProgress方法都会触发onProgressUpdate执行
* onProgressUpdate是在UI线程中执行,所有可以对UI空间进行操作
*/
@Override
protected void onProgressUpdate(Integer... values) {
int vlaue = values[0];
asyncProgress.setProgress(vlaue);
}

}

四、项目地址

https://github.com/sdwfqin/AndroidSamples