zoukankan      html  css  js  c++  java
  • Android_AsyncTask

    android学习之AsyncTask

    AsyncTask,即异步任务,是Android给我们提供的一个处理异步任务的类.通过此类,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程.

    构建AsyncTask子类的泛型参数

    AsyncTask<Params,Progress,Result>是一个抽象类,通常用于被继承.继承AsyncTask需要指定如下三个泛型参数:

    Params:启动任务时输入的参数类型.

    Progress:后台任务执行中返回进度值的类型.

    Result:后台任务执行完成后返回结果的类型.

    构建AsyncTask子类的回调方法

    AsyncTask主要有如下几个方法:

    doInBackground:必须重写,异步完成耗时操作

    onPreExecute:执行后台耗时操作前被调用,通常用于进行初始化操作、初始化进度条.

    onPostExecute:当doInBackground方法完成后,系统将自动调用此方法,并将doInBackground方法返回的值传入此方法.通过此方法进行UI的更新.

    onProgressUpdate:当在doInBackground方法中调用publishProgress方法更新任务执行进度后,将调用此方法.通过此方法我们可以知晓任务的完成进度.

    使用方式eg一:实例化对象

     1 class MyAsyncTask extends AsyncTask<String,Void,Bitmap> {
     2 
     3         //onPreExecute用于异步处理前的操作
     4         @Override
     5         protected void onPreExecute() {
     6             super.onPreExecute();
     7             //此处将progressBar设置为可见.
     8             progressBar.setVisibility(View.VISIBLE);
     9         }
    10 
    11         //在doInBackground方法中进行异步任务的处理.
    12         @Override
    13         protected Bitmap doInBackground(String... params) {
    14             //获取传进来的参数
    15             String url = params[0];
    16             Bitmap bitmap = null;
    17             URLConnection connection ;
    18             InputStream is ;
    19             try {
    20                 connection = new URL(url).openConnection();
    21                 is = connection.getInputStream();
    22                 BufferedInputStream bis = new BufferedInputStream(is);
    23                 //通过decodeStream方法解析输入流
    24                 bitmap = BitmapFactory.decodeStream(bis);
    25                 is.close();
    26                 bis.close();
    27             } catch (IOException e) {
    28                 e.printStackTrace();
    29             } catch (InterruptedException e) {
    30                 e.printStackTrace();
    31             }
    32             return bitmap;
    33         }
    34 
    35         //onPostExecute用于UI的更新.此方法的参数为doInBackground方法返回的值.
    36         @Override
    37         protected void onPostExecute(Bitmap bitmap) {
    38             super.onPostExecute(bitmap);
    39             //隐藏progressBar
    40             progressBar.setVisibility(View.GONE);
    41             //更新imageView
    42             imageView.setImageBitmap(bitmap);
    43         }
    44     }

    使用方法二:匿名对象使用(线程池引入)

    1.    public static ExecutorService LIMITED_TASK_EXECUTOR;
    
    2.    static {
            LIMITED_TASK_EXECUTOR = Executors.newFixedThreadPool(15);
        }
    
    3.    new AsyncTask<Void,Void,Boolean>(){
                @Override
                protected Boolean doInBackground(Void... voids) {
                    Boolean result=TALKSDK.getInstance().startRealPlay(0,CommUtils.getString("deviceserIal",null,getApplicationContext()),deviceNo,call_surfaceView,mHandler);
                    return result;
                }
                
                protected void onPostExecute(Boolean result) {
                    if(result){
                        Toaster.showShort(
                                VideoModuleActivity.this, "预览成功");
                    }else{
                        Toaster.showShort(
                                VideoModuleActivity.this, "预览失败");
                    }
                };
            }.executeOnExecutor(LIMITED_TASK_EXECUTOR);

    使用方法三:进度条更新

    class MyAsyncTask extends AsyncTask<Void,Integer,Void>{
            @Override
            protected void onProgressUpdate(Integer... values) {
                super.onProgressUpdate(values);
                //通过publishProgress方法传过来的值进行进度条的更新.
                progressBar.setProgress(values[0]);
            }
    
            @Override
            protected Void doInBackground(Void... params) {
                //使用for循环来模拟进度条的进度.
                for (int i = 0;i < 100; i ++){
                    //如果task是cancel状态,则终止for循环,以进行下个task的执行.
                    if (isCancelled()){
                        break;
                    }
                    //调用publishProgress方法将自动触发onProgressUpdate方法来进行进度条的更新.
                    publishProgress(i);
                    try {
                        //通过线程休眠模拟耗时操作
                        Thread.sleep(300);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                return null;
            }
        }

    使用AsyncTask的注意事项

    ① 必须在UI线程中创建AsyncTask的实例.

    ② 只能在UI线程中调用AsyncTask的execute方法.

    ③ AsyncTask被重写的四个方法是系统自动调用的,不应手动调用.

    ④ 每个AsyncTask只能被执行(execute方法)一次,多次执行将会引发异常.

    ⑤ AsyncTask的四个方法,只有doInBackground方法是运行在其他线程中,其他三个方法都运行在UI线程中,也就说其他三个方法都可以进行UI的更新操作.

    注:本文参考文章http://www.cnblogs.com/caobotao/p/5020857.html如有疑问请联系删除

  • 相关阅读:
    k8s 资源管理
    Kubernetes核心组件
    python复习
    项目发布
    tornado
    斯巴达系统(一)
    Tornado-第三篇-tornado支持websocket协议
    Tornado-第二篇-异步非阻塞
    Tornado-第一篇-搭建网页
    python--面向对象的特殊方法(反射,内置方法)
  • 原文地址:https://www.cnblogs.com/rainbowLover/p/10430640.html
Copyright © 2011-2022 走看看