public class AsyncTaskTask extends Activity {
TextView asynctask_textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.async_task);
asynctask_textView=(TextView) findViewById(R.id.asynctask_textview);
asynctask_textView.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Asynctask task=new Asynctask();
task.execute();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.async_task, menu);
return true;
}
class Asynctask extends AsyncTask<String, ProgressBar, String>{
//第一个String定义了task.execute()参数的数据类型,对应doInBackground(String... params)中的params。
//第二个ProgressBar指定进度显示条即onProgressUpdate(......)的类型。
//第三个String定义返回结果类型,即doinbackground(..)中的text,onPostExecute(...)中result的类型
@Override
protected String doInBackground(String... params) {//运行,此方法中不可对ui进行修改
// TODO Auto-generated method stub
String text="change";
return text;
}
@Override
protected void onCancelled(String result) {//取消
// TODO Auto-generated method stub
super.onCancelled(result);
}
@Override
protected void onPostExecute(String result) {//接受doinbackground的结果并显示,可对ui修改。
//result的值为return text。
// TODO Auto-generated method stub
asynctask_textView.setText(result);//修改textview内容为"change"
}
@Override
protected void onProgressUpdate(ProgressBar... values) {//doinbackground进度显示,无关痛痒
// TODO Auto-generated method stub
super.onProgressUpdate(values);
}
}
}
为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
1) Task的实例必须在UI thread中创建
2) execute方法必须在UI thread中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法
4) 该task只能被执行一次,否则多次调用时将会出现异常
doInBackground方法和onPostExecute的参数必须对应,这两个参数在AsyncTask声明的泛型参数列表中指定,第一个为doInBackground接受的参数,第二个为显示进度的参数,第第三个为doInBackground返回和onPostExecute传入的参数。