• 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实例只能执行一次,如果调用多次,将会报异常。
     
     
     
     





  • 相关阅读:
    反射之初认识
    面向对象(上)练习一 改进:调用方法
    关于php中id设置自增后不连续的问题
    由于定界符引出的格式错误问题
    PHP 关于timezone问题
    2016.4.29 园子第一天,希望所有的坚持都有所收获
    递归调用
    动手动脑
    界面实验任务
    课程作业02
  • 原文地址:https://www.cnblogs.com/Doing-what-I-love/p/5532974.html
Copyright © 2020-2023  润新知