java.lang.Object
↳android.os.AsyncTask<Params, Progress, Result>
概要
AsyncTask可以方便适当地使用UI线程。他允许执行后台操作并且可以直接在UI线程上发布结果,而不需要操作线程或handler。
一个异步任务(asynchronous task)由一个后台运行的计算(computation)来定义,他的结果将在UI线程上发布。
一个异步任务(asynchronous task)由3个泛化类型(Params,Progress,Result)和4个步骤(begin, doInBackground, processProgress, end)来定义说明。
用法
AsyncTask必须继承使用。子类至少必须重写一个方法(doInBackground(Params...))。通常,还会重写另一个方法(onPostExecute(Result))。
一个子类的例子:
view plaincopy to clipboardprint?
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");
}
}
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");
}
}
创建之后,任务的执行非常简单:
view plaincopy to clipboardprint?
01.new DownloadFilesTask().execute(url1, url2, url3);
new DownloadFilesTask().execute(url1, url2, url3);
AsyncTask的3个泛化类型
异步任务使用如下3种类型:
1. Params,传递给任务的参数类型。
2. Progress,后台计算执行过程中,进步单位(progress units)的类型。(就是后台程序已经执行了百分之几了。)
3. Result, 后台执行返回的结果的类型。
AsyncTask并不总是需要使用上面的全部3种类型。标识不使用的类型很简单,只需要使用Void类型即可。
view plaincopy to clipboardprint?
01.private class MyTask extends AsyncTask<Void, Void, Void> { ... }
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
AsyncTask的4个步骤
一个异步任务需要执行下面4个步骤
1. onPreExecute(), 该步骤在任务被执行之后立即由UI线程调用。
这个步骤通常用来建立任务,在用户接口(UI)上显示进度条。
2. doInBackground(Params...), 该步骤由后台线程在onPreExecute()方法执行结束后立即调用。该步骤通常被用来执行耗时的后台计算。计算的结果必须由该步骤返回,并被传递到最后一个步骤中。该步骤也可以使用publishProgress(Progress...)来发布一个或多个进度单位(units of progress)。这些值将会在onProgressUpdate(Progress...)步骤中被发布到UI线程。
3. onProgressUpdate(Progress...), 该步骤由UI线程在publishProgress(Progress...)方法调用完后被调用。
并未定义该方法执行的时机。该方法在后台进程计算仍在执行的时候,在UI上显示任何形式的进度。一般用于动态地显示一个进度条或者在文本框中显示log。
4. onPostExecute(Result), 由UI进程在后台计算结束后调用。后台计算的结果会被作为参数传递给这一步骤。
线程规则
为了能使该类正常执行,需要遵循下列规则:
- Task的实例必须在UI线程中被调用。
- execute(Params...)必须在UI线程中调用。
- 不要手动调用onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...)。
- Task只能被执行一次,如果想第二次执行会抛出异常。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/pwair/archive/2010/11/23/6030364.aspx
有一些线程规则必须去遵守,这个类才会正确的工作:
*任务实例必须创建在 UI线程
* execute(Params...)必须在 UI线程上调用
*不要手动调用 onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...)
*任务会执行仅一次(假如有第二个尝试去执行,将抛出一个异常)
01 |
public
class
Double extends
Activity { |
02 |
|
03 |
public
ProgressBar pBar; |
04 |
|
05 |
/** Called when the activity is first created. */ |
06 |
@Override |
07 |
protected
void
onCreate(Bundle savedInstanceState) { |
08 |
super .onCreate(savedInstanceState);
|
09 |
setContentView(R.layout.main);
|
10 |
pBar = (ProgressBar) findViewById(R.id.progress_bar);
|
11 |
//线程规则二:execute(Params...)必须在UI线程上调用
|
12 |
new
AsyncLoader().execute((Void) null );
|
13 |
}
|
14 |
|
15 |
public
void
initProgress() { |
16 |
pBar.setProgress( 0 );
|
17 |
//这里可以做一些初始化工作,我就不麻烦写了,写几个变态的for循环算了
|
18 |
for
( int
i = 0 ; i <
100 ; i++) {
|
19 |
System.out.println( "***********"
+ i + "*************" );
|
20 |
}
|
21 |
pBar.setProgress( 30 );
|
22 |
//这里可以做一些初始化工作,我就不麻烦写了,写几个变态的for循环算了
|
23 |
for
( int
i = 0 ; i <
100 ; i++) {
|
24 |
System.out.println( "***********"
+ i + "*************" );
|
25 |
}
|
26 |
pBar.setProgress( 60 );
|
27 |
//这里可以做一些初始化工作,我就不麻烦写了,写几个变态的for循环算了
|
28 |
for
( int
i = 0 ; i <
100 ; i++) {
|
29 |
System.out.println( "***********"
+ i + "*************" );
|
30 |
}
|
31 |
pBar.setProgress( 100 );
|
32 |
Intent intent =
new
Intent(Double. this , Double2. class );
|
33 |
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
34 |
startActivity(intent);
|
35 |
finish();
|
36 |
}
|
37 |
|
38 |
//继承于AsyncTask
|
39 |
class
AsyncLoader extends
AsyncTask<Void, Void, Integer>{ |
40 |
|
41 |
@Override |
42 |
protected
Integer doInBackground(Void... params) { |
43 |
initProgress();
|
44 |
return
null ;
|
45 |
}
|
46 |
|
47 |
}
|
48 |
} |