Xiaoke's Blog

未觉池塘春草梦,阶前梧叶已秋声

Android AsyncTask简单用法

三个泛型参数:

  • Param 任务执行器需要的数据类型
  • Progress 后台计算中使用的进度单位数据类型
  • Result 后台计算返回结果的数据类型

有些参数是可以设置为不使用的,只要传递为Void型即可,比如 AsyncTask<Void,Void, Void>

四个步骤:

  • onPreExecute() 执行预处理,它运行于UI线程,可以为后台任务做一些准备工作,比如绘制一个进度条控件。
  • doInBackground(Params…) 后台进程执行的具体计算在这里实现,doInBackground(Params…)是AsyncTask的关键,此方法必须重载。在这个方法内可以使用publishProgress(Progress…)改变当前的进度值。
  • onProgressUpdate(Progress…) 运行于UI线程。如果在doInBackground(Params…)中
    使用了publishProgress(Progress…),就会触发这个方法。在这里可以对进度条控件根据进度值做出具体的响应。
  • onPostExecute(Result) 运行于UI线程,可以对后台任务的结果做出处理,结果就是doInBackground(Params…)的返回值。此方法也要经常重载,如果Result为null表明后台任务没有完成(被取消或者出现异常)。

这4个方法都不能手动调用。而且除了doInBackground(Params…)方法,其余3个方法都是被UI线程所调用的,所以要求:

  1. AsyncTask的实例必须在UI thread中创建;
  2. AsyncTask.execute方法必须在UI thread中调用;

Task只能被执行一次,多次调用时将会出现异常,而且是不能手动停止。

代码示例:

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

/**
* @author mcxiaoke
* @date 2010.10.12
* @description AsyncTask Test
*/

public class AsyncTaskTest extends Activity {
TextView tv;
final String TAG = "AsyncTaskTest";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv = (TextView) findViewById(R.id.label);
new MyTask().execute(6, 12, 7);

}

class MyTask extends AsyncTask<Integer, Integer, Integer>

{


@Override
protected void onPreExecute() {
super.onPreExecute();
Log.d(TAG, "onPreExecute()");
}

@Override
protected Integer doInBackground(Integer... params) {
Log.d(TAG, "doInBackground()");
int p = 0;
for (int index = 0; index < params.length;
index++) {
int num = params[index];
for (int j = 0; j < num;
j++) {
if (num - j <= 0) {
break;
}
p++;
publishProgress(p);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
return p;
}

@Override
protected void onProgressUpdate(Integer... progress) {
Log.d(TAG, "onProgressUpdate()");
tv.append("nProgress: " + progress[0]);
}

@Override
protected void onPostExecute(Integer result) {
Log.d(TAG, "onPostExecute()");
tv.append("nFinished. Result: " + result);
}

@Override
protected void onCancelled() {
super.onCancelled();
Log.d(TAG, "onCancelled()");
}
}

}

mcxiaoke

A Android/Java/Python developer and entrepreneur. Spends his time travelling the world with a bag of kites. Likes books and movies.

Comments