AsyncTask指南

2019-11-07  本文已影响0人  sunjiandev

AsyncTask指南

通过AsyncTask,可以正确,轻松地使用UI线程。此类允许您执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

AsyncTask被设计为围绕{@link Thread}和{@link Handler}的帮助类,并且不构成通用的线程框架。理想情况下 ,AsyncTasks应该用于短时间的操作(最多几秒钟),一般用于一些io操作,不建议用于网络请求,由于网络请求的不确定性,可能达到十多秒以上。如果需要长时间保持线程运行,强烈建议您使用java.util.concurrent软件包提供的各种API,例如 ExecutorThreadPoolExecutorFutureTask

异步任务是在子线程中执行,并将结果发送到ui线程中。异步任务是由3种一般类型,称为定义ParamsProgressResult,和4个步骤,称为onPreExecutedoInBackgroundonProgressUpdateonPostExecute

用法

必须将AsyncTask子类化才能使用,由于Async是一个抽象类,所以需要子类实现。子类将覆盖至少一个方法 doInBackground,大多数情况下将覆盖第二个方法 onPostExecute

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
      protected Long doInBackground(URL... urls) {
          int count = urls.length;
          long totalSize = 0;
          for (int i = 0; i < count; i++) {
              totalSize += Downloader.downloadFile(urls[i]);
              publishProgress((int) ((i / (float) count)  100));
              // Escape early if cancel() is called
              if (isCancelled()) break;
          }
          return totalSize;
      }
 
      protected void onProgressUpdate(Integer... progress) {
          setProgressPercent(progress[0]);
      }
 
      protected void onPostExecute(Long result) {
          showDialog("Downloaded " + result + " bytes");
      }
  }

创建完成后,任务将非常简单地执行:

new DownloadFilesTask().execute(url1,url2,url3);

AsyncTask 的三个参数

四个函数

取消任务

可以通过调用 cancel(boolean随时取消任务。调用此方法调用此方法不会导致任务立即被取消,只是更改了中断的标志位。控制异步任务执行结束后不会回调onPostExecute()。正确的取消异步任务要cancel()方法doInbacground()做判断跳出循环

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
      protected Long doInBackground(URL... urls) {
          int count = urls.length;
          long totalSize = 0;
          for (int i = 0; i < count; i++) {
              totalSize += Downloader.downloadFile(urls[i]);
              publishProgress((int) ((i / (float) count)  100));
              
              //-----------------------------
              // Escape early if cancel() is called
               if (isCancelled()) break;
              //-----------------------------
               
          }
          return totalSize;
      }
 
      protected void onProgressUpdate(Integer... progress) {
          setProgressPercent(progress[0]);
      }
 
      protected void onPostExecute(Long result) {
          showDialog("Downloaded " + result + " bytes");
      }
  }

避坑指南

上一篇 下一篇

猜你喜欢

热点阅读