AsyncTask使用详解

前言

在Android开发中,我们不可避免的会涉及到很多异步的操作,在众多异步操作的知识中,AsyncTask无疑是比 Handler 使用更加简洁,但是很抱歉的是,我竟然基本没用过它,对它的了解一直只是停留在"AsyncTask可以用来处理线程异步的问题",至于更多的,是不甚知道的。在后来的开发过程中,也偶尔见到AsyncTask的身影,见其使用代码,知道是AsyncTask,也能看懂其使用,但自那之后,是记不起AsyncTask如何使用的,时间累积,就基本不考虑AsyncTask实现异步的操作了,大多是采用其他方式实现异步。但毕竟是个坑,不能每次都采用绕道的方式吧,这便是今天这篇文章的缘由。

今天涉及内容:

  1. AsyncTask使用总览
  2. AsyncTask中onProgressUpdate执行条件
  3. AsyncTask传参解释
  4. AsyncTask无参执行
  5. AsyncTask传简单参数
  6. AsyncTask传多个参数
  7. AsyncTask传复杂参数
  8. 效果图和项目结构图

先来波效果图


AsyncTask使用详解_第1张图片
1.gif

一. AsyncTask使用总览

AsyncTask使用代码如下:

        AsyncTask asyncTask=new AsyncTask(){

            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                //在主线程中执行,此方法第一个执行
                
                LogUtil.i("=========onPreExecute=====");
            }

            @Override
            protected Void doInBackground(Void... voids) {
                //在子线程执行,执行耗时操作
                //......
                
                LogUtil.i("=========doInBackground=====");

                publishProgress(voids);
                return null;
            }

            @Override
            protected void onProgressUpdate(Void... values) {
                super.onProgressUpdate(values);
                //在主线程中执行,在任务执行过程中不断回调
                //这个方法要执行,需要在 doinbackground()方法中
                //调用publishProgress()方法
                
                LogUtil.i("=========onProgressUpdate=====");
            }

            @Override
            protected void onPostExecute(Void aVoid) {
                super.onPostExecute(aVoid);
                //在主线程执行,任务完成后执行
                //若doInBackground()方法执行完后有返回值,则是在此处接收返回值并处理
                
                LogUtil.i("=========onPostExecute=====");
                LogUtil.i("=========aVoid="+aVoid);
            }
        };
        //只执行一次
        asyncTask.execute();

AsyncTask执行过程中,会依次执行以下四个方法:

  • onPreExecute():在主线程中执行,此方法第一个执行,一般做准备工作
  • doInBackground():在子线程执行,执行耗时操作(此方法中最后若执行publishProgress(voids)方法,onProgressUpdate()才会执行)
  • onProgressUpdate():在主线程中执行,在任务执行过程中不断回调,这个方法要执行,需要在 doinbackground()方法中调用publishProgress()方法,若不调用,则此方法不会执行。
  • onPostExecute():在主线程执行,任务完成后执行,若doInBackground()方法执行完后有返回值,则是在此处接收返回值并处理,若doInBackground()无返回值,则此处接收参数为null

AsyncTask的这四个方法,doinbackground()必须重写,其他可选。最后调用asyncTask.execute()asyncTask.execute(Object obj)启动异步执行。一个AsyncTasknew之后只能启动一次asyncTask.execute()asyncTask.execute(Object obj)

二.AsyncTask中onProgressUpdate执行条件

在 上面已经讲过,当doInBackground()中调用publishProgress(voids)方法时,AsyncTask执行顺序为:

onPreExecute() ----> doInBackground() ----> onProgressUpdate() ----> onPostExecute()

doInBackground()中不调用publishProgress(voids)方法时,AsyncTask执行顺序为:

onPreExecute() ----> doInBackground() ----> onPostExecute()

三. AsyncTask传参解释

AsyncTask初始化有这么段代码:

new AsyncTask()

我们可以看到里面涉及到三个参数:

new AsyncTask()
  • 其中parmas1是设置doInBackground()中的参数类型,当doInBackground()无需传参的时候,parmas1设置为Void(不是void)
  • parmas2是设置onProgressUpdate()中的参数类型,当onProgressUpdate()无需传参的时候,parmas2设置为Void(不是void)
  • parmas3是设置onPostExecute()中的参数类型,也即是doInBackground()中的返回数据类型,当onProgressUpdate()无需传参的时候,parmas3设置为Void(不是void),这时onPostExecute()中收到的参数值为null

四. AsyncTask无参执行

这是AsyncTask最简单的使用方式,你可以直接在代码中类似这样写:

        new AsyncTask() {
            @Override
            protected Void doInBackground(Void... voids) {
                LogUtil.i("======子线程耗时操作======");
                return null;
            }

            @Override
            protected void onPostExecute(Void aVoid) {
                LogUtil.i("======接收子线程返回数据进行ui展示======");
                super.onPostExecute(aVoid);
            }
        }.execute();

运行结果如下:

doInBackground(MainActivity.java:92): ======子线程耗时操作======
onPostExecute(MainActivity.java:98): ======接收子线程返回数据进行ui展示======

五. AsyncTask传简单参数

传递简单参数,你可以直接这样:

    /**传简单参数**/
    private void test3(String str){
        new AsyncTask() {
            @Override
            protected String doInBackground(String... params) {
                String op=str;

                //处理业务逻辑
                //......

                return op;
            }

            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);

                LogUtil.i("=====收到doInBackground返回值======="+s);
            }
        }.execute();
    }

运行结果如下:

onPostExecute(MainActivity.java:125): =====收到doInBackground返回值=======大家好

六.AsyncTask传多个参数

传多个参数,你可以这样:

你可能感兴趣的:(AsyncTask使用详解)