是一个抽象泛型类,由 Android 封装的一个轻量级异步类,它可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。
内部封装了两个线程池(SerialExecutor、THREAD_POOL_EXECUTOR)和一个Handle(InternalHandler)。SerialExecutor 用于任务的排队,让需要执行的多个耗时任务按顺序排列。THREAD_POOL_EXECUTOR 才真正的执行任务。InternalHandler 用于从子线程切换到主线程。
public abstract class AsyncTask //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
{ -
- //任务执行前
- 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);
- }
- }