zoukankan      html  css  js  c++  java
  • AsyncTask 异步线程 用法

    AsyncTask介绍
    Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理。首先明确Android之所以有Handler和AsyncTask,都是为了不阻塞主线程(UI线程),且UI的更新只能在主线程中完成,因此异步处理是不可避免的。Android为了降低这个开发难度,提供了AsyncTask。AsyncTask就是一个封装过的后台任务类,顾名思义就是异步任务。AsyncTask直接继承于Object类,位置为android.os.AsyncTask。要使用AsyncTask工作我们要提供三个泛型参数,并重载几个方法(至少重载一个)。

    AsyncTask定义了三种泛型类型 Params,Progress和Result。

    Params 启动任务执行的输入参数,比如HTTP请求的URL。
    Progress 后台任务执行的百分比。
    Result 后台执行任务最终返回的结果,比如String。

    public class MyAsyncTask extends AsyncTask<Integer, Integer, Integer> {....}

    根据我们的需要重写以下方法:

    (1)doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。(此方法必须重写


    (2)onPostExecute(Result) 相当于Handler 处理UI的方式,方法参数就是在doInBackground 得到的处理结果,此方法在主线程执行可以操作UI。 

    (3)onProgressUpdate(Progress…) 可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。(如果是用此方法必须在doInBackground方法中使用publicProgress它传入进度值


    (4)onPreExecute() 这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。


    (5)onCancelled() 用户调用取消时被触发。


    注意以下情况:

    (1)AsyncTask的实例必须在UI thread中创建;
    (2)execute方法必须在UI thread中调用;同一个实例只能执行一次execute方法。多次调用时将会抛出异常。

    例子:

    public class MyAsyncTask extends AsyncTask<Integer, Integer, Integer> {
    
        TextView txtView;
        ProgressBar pb;
    
        public MyAsyncTask(TextView txtView, ProgressBar pb) {
            this.txtView = txtView;
            this.pb = pb;
        }
    
        /**
         * 后台执行方法,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,
         * 完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress()来更新任务的进度。
         * 这里的参数对应AsyncTask的第一个参数, 这里的返回值对应AsyncTask,第三个参数。
         */
        @Override
        protected Integer doInBackground(Integer... params) {
    
            int num = 0;
            for (int i = 0; i < params[0]; i++) {
                num += i;
    
                publishProgress(i);// 注意:如果要在onProgressUpdate方法更新处理进度。这个方法必须加。
                try {
    
                    Thread.sleep(500);// 模拟任务处理时间
    
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return num;
        }
    
        /**
         * 这里的Integer参数对应AsyncTask中的第三个参数(这个值就是doInBackground的返回值)
         * 在doInBackground方法执行结束之后在运行,并且运行在UI线程当中 可以对UI空间进行设置
         */
        @Override
        protected void onPostExecute(Integer result) {
            txtView.setText("结果:" + String.valueOf(result));
            super.onPostExecute(result);
        }
    
        /**
         * 当任务执行之前开始调用此方法,可以在这里提示用户任务已经开始执行了。 该方法运行在UI线程当中,并且运行在UI线程当中 可以对UI空间进行设置
         */
        @Override
        protected void onPreExecute() {
            txtView.setText("请稍等那边正在处理呢");
            super.onPreExecute();
        }
    
        /**
         * 进度更新方法,此方法运行在UI线程中,因此可以操作UI
         * 这里的参数是在doInBackground方法中通过publishProgress方法传入的。
         */
        @Override
        protected void onProgressUpdate(Integer... values) {
            pb.setProgress(values[0]);
            super.onProgressUpdate(values);
        }
    
        /**
         * 取消AsyncTask任务时出发。Integer参数是取消的时候doInBackground已经处理的结果。
         */
        @Override
        protected void onCancelled(Integer result) {
            super.onCancelled(result);
        }
    
    }
    View Code

    在Acitivity中调用

    MyAsyncTask task=new MyAsyncTask(txtview1,progressBar1);

    task.excute(1000);//对应AsyncTask的第一个参数

    task.cancel(boolean);//取消任务,这个方法很有意思。有兴趣的可以查查。

  • 相关阅读:
    校招 存储相关研发工程师 收人要求
    Ubuntu配置
    个人感想
    Linux入门 文本编辑器
    linux入门 一些常见命令
    linux入门 配置网络
    面试逻辑题 5L和3L的杯子 8L的水 倒出4L
    Java并发编程的艺术读后总结
    URL重写
    常见的四种排名函数的用法----转载
  • 原文地址:https://www.cnblogs.com/ywtk/p/3817975.html
Copyright © 2011-2022 走看看