概述: 
 
 
 
  AsyncTask 可以很适合,方便的利用UI线程。它允许开发者执行后台操作,发布结果在UI线程并且不需要做线程间的切换操作。 
 
 
 
  它的主要适合于短时操作的情景,如果需要长时间的线程运行,后台操作的话 Executor, ThreadPoolExecutor and FutureTask这三个类比较合适。 
 
 
 
  用法: 
 
 
 
  AsyncTask 必须被subclassed之后才可以使用。子类需要重写至少一个方法(doInBackground(Params...)),举个栗子: 
 
 
 
  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");   
 
 
 
  } 
 
 
  
 
  } 
 
 
 
  类创建好之后,调用下面的语句来执行task。 
 
 
 
  new 
   DownloadFilesTask
  ().execute
  (url1
  , url2
  , url3
  ); 
 
 
 
  下面说一下 
 
 
 | AsyncTask<Params, Progress, Result> | 
  类里的参数所代表的意义。 
 
 
 
  Params,是在任务执行的时候所需要的参数类型,比如网络请求一般都需要一个地址链接,需要Url,Params可以设置为String,或者URL都行。(在介绍Asynctask的方法里有涉及到,到时细说) 
 
 
 
  Progress,表示任务执行的进度,可以是Int,Long。。等。这个值通常会用于设置显示进度的值。 
 
 
 
  Result,表示任务执行完毕,返回的结果类型。 
 
 
 
  AsyncTask常用方法: 
 
 
 
  1.onPreExecute();这个方法在任务task执行之前被调用,通常在该方法内设置task,比如:展示一个progress bar。在UI线程执行。 
 
 
 
  2.doInBackgroud(Params…);该方法在onPreExecute()方法执行完之后立即执行,该方法主要用来计算,处理task,所以该方法会花费一些时间。上面所说的第一个参数Params就在这个方法中有用到,该方法中可以调用publishProgress(Progress...)方法来展示任务的处理进度,doInBackground()方法执行在后台线程,对此你可能会疑惑,既然是执行在后台线程的,为什么任务进度可以在UI线程显示?别急。。。 
 
 
 
  3.onProgressUpdate(Progress…);该方法在publishProgress方法调用之后执行,并且运行在UI线程。由此就明白了为什么可以吧任务进度显示出来,就是因为调用了publishProgress和onProgressUpdate这个两个方法,前者用于任务进度的赋值,后者用与UI主线程显示进度。 
 
 
 
  4.onPostExecute(Result);该方法在运行在UI线程,并且在耗时任务处理完成之后执行。他的参数Result就是处理任务的结果的类型。 
 
 
 
  关于取消一个任务 
 
 
 
  一个task可以通过调用cancel(boolean)方法在任何时间取消任务。调用该方法之后,会调用isCancelled()方法返回true,调用该方法之后,会调用onCancelled(object)方法代替onPostExecute(object)在doInBackgroup方法后执行。为了尽快确定该task被cancel与否,需要在doInbackgroup方法里周期的检测isCancelled方法的返回值。 
 
 
 
  注意: 
 
 
 
  1.AsyncTask class 必须被加载在UI线程,这个在4.1之后系统自动加载了。 
 
 
 
  2.Task的实例必须创建在UI线程。 
 
 
 
  3.execute(Params...)等执行任务的方法必须在UI线程调用。 
 
 
 
  4.不能手动的调用 onPreExecute(), onPostExecute(Result), doInBackground(Params...),onProgressUpdate(Progress...) 方法。 
 
 
 
  5.任务只可以被执行一次,超过的话会报错。 
 
 
 
  AsyncTask默认情况下的执行任务方式是SERIAL_EXECUTOR在backgroud线程中顺序的处理任务。如果想平行的处理任务,需要调用 executeOnExecutor(java.util.concurrent.Executor, Object[]) withTHREAD_POOL_EXECUTOR.