一、概念
是一个抽象泛型类,由 Android 封装的一个轻量级异步类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。
内部封装了两个线程池(SerialExecutor、THREAD_POOL_EXECUTOR)和一个Handle(InternalHandler)。SerialExecutor 用于任务的排队,让需要执行的多个耗时任务按顺序排列。THREAD_POOL_EXECUTOR 才真正的执行任务。InternalHandler 用于从子线程切换到主线程。
二、使用
public abstract class AsyncTask<Params, Progress, Result> //Parmas:对应 doInBackground() 中的参数类型,即任务开始时,传入的参数类型。 //Progress:对应 onProgressUpdate() 中的参数类型,即任务执行中,返回下载进度值的类型。 //Result:对应 onPostExecute() 中的参数类型,即任务执行完,返回的结果类型。 //如果三个方法确定不需要传递具体参数,那么这三个泛型参数可以用 Void 代替。 | |
onPreExecute( ) | 任务执行前调用,在主线程执行(用于界面初始化操作如弹出进度条对话框等)。 |
doInBackground( ) | 执行耗时任务,在子线程执行。调用 publishProgress( ) 设置进度,调用 return 返回结果。 |
onProgressUpdate( ) | 用于更新进度,在主线程执行。 |
onPostExecute( ) | 用于获取结果,在主线程执行。 |
onCancelled( ) | 任务取消时调用,在主线程执行。并不是真正取消任务只是设置为取消状态,类似于终止一个线程调用 interrupt() 只是标记中断。 |
mTask = new MyTask(); //注意每次需new一个实例,一个AsyncTask任务只能被执行一次,否则会出现异常
mTask.execute("http://www.baidu.com","www.qq.com","www.taobao.com");
mTask.cancel(true); //取消一个正在执行的任务,onCancelled方法将会被调用
private class MyTask extends AsyncTask<String, Integer, String>{
//任务执行前
protected void onPreExecute() {
textView.setText("loading...");
}
//执行任务
protected String doInBackground(String... params) {
try {
HttpClient client = new DefaultHttpClient();
HttpGet get = new HttpGet(params[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((int) ((count / (float) total) * 100));
Thread.sleep(500); //为了演示进度,休眠500毫秒
}
return new String(baos.toByteArray(), "gb2312");
}
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
return null;
}
//更新进度
protected void onProgressUpdate(Integer... progresses) {
progressBar.setProgress(progresses[0]);
textView.setText("loading..." + progresses[0] + "%");
}
//获取结果
protected void onPostExecute(String result) {
textView.setText(result);
execute.setEnabled(true);
cancel.setEnabled(false);
}
//任务取消时
protected void onCancelled() {
textView.setText("cancelled");
progressBar.setProgress(0);
execute.setEnabled(true);
cancel.setEnabled(false);
}
}