• Android AsyncTask


    AsyncTask类任务管理:

      内部会创建一个进程作用域的线程池来管理要运行的任务,也就就是说当你调用了AsyncTask#execute()后,AsyncTask会把任务交给线程池,由线程池来管理创建Thread和运行Therad。

    3.0以后的AsyncTask类加载方法:

    //按先后顺序每次只运行一个
    private static ExecutorService SINGLE_TASK_EXECUTOR = (ExecutorService) Executors.newSingleThreadExecutor(); 
    
    //自定义的CorePoolSize为7的线程池,允许7个线程同时运行
    private static ExecutorService  LIMITED_TASK_EXECUTOR = (ExecutorService) Executors.newFixedThreadPool(7);  
    
    //未设限制,全部执行
    private static ExecutorService  FULL_TASK_EXECUTOR = (ExecutorService) Executors.newCachedThreadPool();  
    
    //提供自定义的线程池来运行和调度Thread
    task.executeOnExecutor(SINGLE_TASK_EXECUTOR);
    //task.executeOnExecutor(LIMITED_TASK_EXECUTOR);
    //task.executeOnExecutor(FULL_TASK_EXECUTOR);

    使用AsyncTask类,以下是几条必须遵守的准则:

    1) Task的实例必须在UI thread中创建;

    2) execute方法必须在UI thread中调用;

    3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;

    4) 不能在doInBackground(Params... params)中更改UI组件的信息。

    5) 该task只能被执行一次,否则多次调用时将会出现异常;

    1 private CustomTask mTask;
    2 @Override  
    3 public void onClick(View v) {  
    4       //注意每次需new一个实例,新建的任务只能执行一次,否则会出现异常  
    5       mTask = new Custom();  
    6       mTask.execute("http://www.baidu.com");
    7 }

    自定义AsyncTask:

    三种泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。

     1 private class CustomTask extends AsyncTask<String, Integer, String> {  
     2         //onPreExecute方法用于在执行后台任务前做一些UI操作  
     3         @Override  
     4         protected void onPreExecute() {  
     5             textView.setText("loading...");  
     6         } 
     7           
     8         //doInBackground方法内部执行后台任务,不可在此方法内修改UI  
     9         @Override  
    10         protected String doInBackground(String... params) {    
    11             try { 
    12                     for (int count = 0; count < 10; count ++) { 
    13                         //调用publishProgress方法公布进度,触发onProgressUpdate方法,从而对UI进行修改 
    14                         publishProgress((int) ((count / (float) total) * 100));  
    15                         //休眠500毫秒  
    16                         Thread.sleep(500);  
    17                     }
    18                     return new String("success"); 
    19             } catch (Exception e) {  
    20                 Log.e(TAG, e.getMessage());  
    21             }  
    22             return null;  
    23         }  
    24           
    25         //onProgressUpdate方法用于更新进度信息  
    26         @Override  
    27         protected void onProgressUpdate(Integer... progresses) {  
    28             progressBar.setProgress(progresses[0]);  
    29             textView.setText("loading..." + progresses[0] + "%");  
    30         } 
    31           
    32         //onPostExecute方法用于在执行完后台任务后更新UI,显示结果  
    33         @Override  
    34         protected void onPostExecute(String result) {  
    35             textView.setText(result); 
    36         }  
    37           
    38         //onCancelled方法用于在取消执行中的任务时更改UI  
    39         @Override  
    40         protected void onCancelled() {  
    41             textView.setText("cancelled");
    42             progressBar.setProgress(0); 
    43         }  
    44     }  

    当需要停止任务时:

    @Override  
    public void onClick(View v) {  
         //取消一个正在执行的任务,onCancelled方法将会被调用  
         mTask.cancel(true);  
    }
  • 相关阅读:
    Tomcat的startup.bat启动后显示乱码--windows终端
    Java 文件组织形式
    连接Linux之win10子系统Linux安装与使用(一)
    连接Linux之win10子系统Linux安装与使用(二)
    vscode omnisharp server load timed out
    在唯一密钥属性“fileExtension”设置为“.json”时,无法添加类型为“mimeMap”的重复集合项
    vscode编译发布exe
    MySQL数据库一般设计规则
    .Net开发常用工具插件
    linx下对文件权限设置
  • 原文地址:https://www.cnblogs.com/CharlesGrant/p/4867296.html
Copyright © 2020-2023  润新知