原文连接:http://blog.csdn.net/liuhe688/article/details/6532519
package com.example.asynctaskdemo;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
/**
* AsyncTask是对Thread+Handler良好的封装
*/
public class AsyncTaskDemo extends Activity {
public static final String TAG = "AsyncTaskDemo";
private TextView tv;
private ProgressBar pb;
private Button execute, cancel;
private MyTask mTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tv = (TextView) this.findViewById(R.id.tv);
pb = (ProgressBar) this.findViewById(R.id.pb);
execute = (Button) this.findViewById(R.id.execute);
cancel = (Button) this.findViewById(R.id.cancel);
cancel.setEnabled(false);
execute.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//注意每次需new一个实例,新建的任务只能执行一次,否则会出现异常
mTask = new MyTask();
mTask.execute("http://www.baidu.com");
execute.setEnabled(false);
cancel.setEnabled(true);
}
});
cancel.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//取消一个正在执行的任务,onCancelled方法将会被调用
mTask.cancel(true);
}
});
}
/**
* 在Android中实现异步任务机制有两种方式,Handler和AsyncTask。
* AsyncTask
* AsyncTask是对Thread+Handler良好的封装
*/
private class MyTask extends AsyncTask
{
@Override
/**
* onPreExecute方法用于在执行后台任务前做一些UI操作
*/
protected void onPreExecute() {
Log.i(TAG, "onPreExecute called");
tv.setText("loading...");
}
@Override
/**
* doInBackground(Params... params)
* doInBackground方法内部执行后台任务,不可在此方法内修改UI
*/
protected String doInBackground(String... params) {
Log.i(TAG, "doInBackground called");
Log.i(TAG, "访问:" + params[0]);
int times = 10;
int progress = 0;
while (times > 0) {
progress += 10;
publishProgress(progress);
// 这里调用的就是onProgressUpdate(Integer... values)
times--;
try {
Thread.sleep(500);// 睡眠500ms
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "访问百度成功";// 这里返回的String类型数据会当作onPostExecute()方法的参数
}
@Override
/**
* onProgressUpdate(Progress... values)
* onProgressUpdate方法用于更新进度信息,这个方法可以被调用多次
*/
protected void onProgressUpdate(Integer... values) {
Log.i(TAG, "onProgressUpdate called");
pb.setProgress(values[0]);
tv.setText("loading..." + values[0] + "%");
}
@Override
/**
* onPostExecute(Result result)
* onPostExecute方法用于在执行完后台任务后更新UI,显示结果
*/
protected void onPostExecute(String result) {
Log.i(TAG, "onPostExecute called");
tv.setText(result);
execute.setEnabled(true);
cancel.setEnabled(false);
}
@Override
/**
* onCancelled方法用于在取消执行中的任务时更改UI
*/
protected void onCancelled() {
Log.i(TAG, "onCancelled called");
tv.setText("cancelled");
pb.setProgress(0);
execute.setEnabled(true);
cancel.setEnabled(false);
}
}
}