一、概念
是一个抽象泛型类,由 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);}
}