AsyncTask

 
 
用法
<疯狂android讲义3> 3.6
  AsyncTask是一个Android SDK中轻量级的异步任务类,它在线程池中执行后台任务,把执行进度和执行结果返回给主线程,并在主线程更新UI,AsyncTask实质上是对Thread和Handler的封装,通过AsyncTask能够更方便地在执行后台任务的过程中和结束后实现更新UI操作。
  AsyncTask是一个抽象类,它需要被实现后才能正常使用,子类必须要复写doInBackground方法,如果需要在执行完后台任务后更新UI,则需要实现onPostExecute方法,下面是一个AsyncTask使用实例:
 
  1. classDownloadFilesTask extends AsyncTask<URL,Integer,Long>{
  2.     @Override
  3.     protectedVoid doInBackground(Integer... params){
  4.         int count = urls.length;
  5.          long totalSize =0;
  6.           for(int i =0; i < count; i++){
  7.               totalSize +=Downloader.downloadFile(urls[i]);
  8.               publishProgress((int)((i /(float) count)*100));
  9.          }
  10.  
  11.           return totalSize;
  12.     }
  13.  
  14.     protectedvoid onProgressUpdate(Integer... progress){
  15.           setProgressPercent(progress[0]);
  16.       }
  17.  
  18.       protectedvoid onPostExecute(Long result){
  19.           showDialog("Downloaded "+ result +" bytes");
  20.       }
  21. }
  22.  
  23. // 调用方式如下
  24. newDownloadFilesTask().excute(url1, url2, url3);
 
enter image description here
 
  • Params:执行AsyncTask时传递的参数类型;
  • Progress:执行后台任务时更新进度的进度值类型;
  • Result:后台任务执行完成后的返回值类型。
 注意:并不是所有的参数都需要指明类型,如果某一个参数你没有用到,改成Void类型即可。
 执行流程
  • onPreExecute:UI线程中调用,在调用excute方法后会立即被调用,这个方法适用于初始化task,比如显示后台任务进度条; doInBackground:非UI线程中调用,在onPreExecute执行后调用,这个方法适用于执行耗时的操作,excute方法中的Params参数就是通过这个方法传递的,该方法的返回值就是Task执行的结果,在doInBackground方法执行过程中,可以通过publishProgress方法来更新后台任务的执行进度;
  •  onProgressUpdate:UI线程中调用,在publishProgress方法后被调用,这个方法用于在后台任务执行过程中显示任务的进度UI,比如它可以用于显示进度条动画或者显示进度文本;
  • onPostExecute:UI线程中调用,后台任务执行完成后被调用,Task返回的结果以参数的形式传递到该方法中。
 取消Task
        AsyncTask可以在任何时候通过cancel(boolean)方法取消,调用这个方法后,isCancelled()方法的返回值会为true,当执行这个cancle方法后,doInBackground方法执行完成后不会调用onPostExecute方法而是执行onCancelled回调。
 
注意在使用AsyncTask的过程中必须要遵守如下原则:
  •  AsyncTask必须在UI线程中实例化;
  •  excute方法必须要在UI线程中调用;
  •  不要人为地调用AsyncTask的回调方法:onPreExecute、onPostExecute、doInBackground和onProgressUpdate;
  •  一个AsyncTask实例只能执行一次,如果调用多次,将会报异常。
 
 
 
 





原文地址:https://www.cnblogs.com/Doing-what-I-love/p/5532974.html