3.Android另外提供了一个工具类:AsyncTask。
它使得UI thread的使用变得异常简单。它使创建需要与用户界面交互的长时间运行的任务变得更简单,不需要借助线程和Handler即可实现。
1) 子类化AsyncTask
2) 实现AsyncTask中定义的下面一个或几个方法
onPreExecute() 开始执行前的准备工作;
doInBackground(Params...) 开始执行后台处理,可以调用publishProgress方法来更新实时的任务进度;
onProgressUpdate(Progress...) 在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
onPostExecute(Result) 执行完成后的操作,传送结果给UI 线程。
这4个方法都不能手动调用。而且除了doInBackground(Params...)方法,其余3个方法都是被UI线程所调用的,所以要求:
1) AsyncTask的实例必须在UI thread中创建;
2) AsyncTask.execute方法必须在UI thread中调用;
同时要注意:该task只能被执行一次,否则多次调用时将会出现异常。而且是不能手动停止的,这一点要注意,看是否符合你的需求!
在使用过程中,发现AsyncTask的构造函数的参数设置需要看明白:
AsyncTask<Params, Progress, Result> Params对应doInBackground(Params...)的参数类型。
而new AsyncTask().execute(Params... params),就是传进来的Params数据,你可以execute(data)来传送一个数据,或者execute(data1, data2, data3)这样多个数据。
Progress对应onProgressUpdate(Progress...)的参数类型;
Result对应onPostExecute(Result)的参数类型。 当以上的参数类型都不需要指明某个时,则使用Void,注意不是void。不明白的可以参考上面的例子,或者API Doc里面的例子。
下面是关于AsyncTask的使用示例:
((Button) findViewById(R.id.load_AsyncTask)).setOnClickListener(
new View.OnClickListener(){
@Override
public
void onClick(View view) {
data =
null;
data =
new ArrayList<String>();
adapter =
null;
//
显示ProgressDialog放到AsyncTask.onPreExecute()里
//
showDialog(PROGRESS_DIALOG);
new ProgressTask().execute(data);
}
});
private
class ProgressTask
extends AsyncTask<ArrayList<String>, Void, Integer> {
/*
该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。
*/
@Override
protected
void onPreExecute() {
//
先显示ProgressDialog
showDialog(PROGRESS_DIALOG);
}
/*
执行那些很耗时的后台计算工作。可以调用publishProgress方法来更新实时的任务进度。
*/
@Override
protected Integer doInBackground(ArrayList<String>... datas) {
ArrayList<String> data = datas[0];
for (
int i=0; i<8; i++) {
data.add("ListItem");
}
return STATE_FINISH;
}
/*
在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,
* 后台的计算结果将通过该方法传递到UI thread.
*/
@Override
protected
void onPostExecute(Integer result) {
int state = result.intValue();
switch(state){
case STATE_FINISH:
dismissDialog(PROGRESS_DIALOG);
Toast.makeText(getApplicationContext(),
"加载完成!",
Toast.LENGTH_LONG)
.show();
adapter =
new ArrayAdapter<String>(getApplicationContext(),
android.R.layout.simple_list_item_1,
data );
setListAdapter(adapter);
break;
case STATE_ERROR:
dismissDialog(PROGRESS_DIALOG);
Toast.makeText(getApplicationContext(),
"处理过程发生错误!",
Toast.LENGTH_LONG)
.show();
adapter =
new ArrayAdapter<String>(getApplicationContext(),
android.R.layout.simple_list_item_1,
data );
setListAdapter(adapter);
break;
default:
}
}
以上是从网络获取数据,加载到ListView中示例。