AsyncTask的定义:
public abstract class AsyncTask<Params, Progress, Result>
以上三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。在特定场合下,并不是所有类型都被使用,如果没有被使用,可以用java.lang.Void类型代替。
异步任务执行步骤:
1、execute(Params... params):执行任务,一般在onCreate中调用这个方法,就可以开始执行任务
2、onPreExecute():调用了execute(Params... params)后就立即执行,用于在执行耗时任务前对UI进行一些操作,比如可以弹出进度对话框
3、doInBackground(Params... params):在onPreExecute()完成后立即执行,本方法是执行耗时任务的(如:获取网络资源),本方法内不能更新UI
4、onProgressUpdate(Progress... values):在调用了publishProgress(Progress... values)后被执行,本方法可以更新进度条,publishProgress(Progress... values)在doInBackground(Params... params)里面调用
5、onPostExecute(Result result):后台操作结束时,执行此方法,比如关闭进度对话框。
MainActivity.java:
package com.example.demo2;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.Activity;
import android.app.ProgressDialog;
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;
public class MainActivity extends Activity {
private Button execute, cancel;
private ProgressBar progress_bar;
private TextView textView;
private ProgressDialog dialog;
private MyTask mTask;
private String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
execute = (Button) findViewById(R.id.execute);
cancel = (Button) findViewById(R.id.cancel);
textView = (TextView) findViewById(R.id.textView);
progress_bar = (ProgressBar) findViewById(R.id.progress_bar);
execute.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// 没次都要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 arg0) {
// 取消一个正在执行的任务,onCancelled将会被调用
mTask.cancel(true);
}
});
}
private class MyTask extends AsyncTask<String, Integer, String> {
// onPreExecute用于执行后台任务前做一些UI操作
@Override
protected void onPreExecute() {
Log.i(TAG, "onPreExecute()");
textView.setText("加载中...");
dialog = ProgressDialog.show(MainActivity.this, "提示", "加载中...");
}
// doInBackground方法内部执行后台任务(就是执行网络请求等耗时任务),不可在此方法内修改UI
@Override
protected String doInBackground(String... arg0) {
Log.i(TAG, "doInBackground(String... arg0)");
try {
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(arg0[0]);
HttpResponse response = client.execute(get);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
HttpEntity entity = response.getEntity();
InputStream is = entity.getContent();
long total = entity.getContentLength();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int count = 0;
int length = -1;
while ((length = is.read(buf)) != -1) {
baos.write(buf, 0, length);
count += length;
// 调用publishProgress公布进度,然后onProgressUpdate方法将被执行
publishProgress((int) ((count / (float) total) * 100));
// 为延时进度,休眠500毫秒
Thread.sleep(500);
}
return new String(baos.toByteArray(), "utf-8");
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
// onProgressUpdate用于更新进度信息
@Override
protected void onProgressUpdate(Integer... values) {
Log.i(TAG, "onProgressUpdate(Integer... values)");
progress_bar.setProgress(values[0]);
textView.setText("loading..." + values[0] + "%");
}
// onPostExecute方法用于在执行完后台任务后更新UI,显示结果
@Override
protected void onPostExecute(String result) {
Log.i(TAG, "onPostExecute(String result)");
dialog.dismiss();
textView.setText(result);
execute.setEnabled(true);
cancel.setEnabled(false);
}
// onCancelled方法用于在取消执行中的任务时更新UI
@Override
protected void onCancelled() {
Log.i(TAG, "onCancelled() called");
textView.setText("任务取消了");
progress_bar.setProgress(0);
execute.setEnabled(true);
cancel.setEnabled(false);
}
}
}
main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/execute"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="执行" />
<Button
android:id="@+id/cancel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="取消" />
<ProgressBar
android:id="@+id/progress_bar"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:max="100"
android:progress="0" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</ScrollView>
</LinearLayout>
不要忘了添加网络访问权限:
<uses-permission android:name="android.permission.INTERNET"/>