什么是异步任务?

异步任务就是开一个子线程,然后让它去跑,它跑完了就会回来告诉你说,它跑完了,这是结果。这和Java中的回调差不多。我们在OKHttp中很长见到的 onSuccess() 和 onError() 这些都是回调函数。当然这篇博文不讨论这些回调,只讨论Android中自带的异步任务。

Android官方在4.0以后的版本系统里面就禁止在主线程访问网络了。

解决这个的唯一的办法就是开一个子线程,子线程去访问网络。刚好,google 给 Android 写了一个方便广大各位编程人员使用的工具类,AsyncTask。下面就来看看这个异步任务怎么用?

首先,写一个类,继承 AsyncTask,实现 AsyncTask 比较简单,必须实现的只有一个方法,那就是doInBackground() 其他都可以不需要去实现的,但通常我们使用的时候都不仅仅是重写 doInBackground() 还有其他函数与之相配合。下面就来看看这几个函数分别是什么,各自有什么作用。

doInBackground()

  这方法是在子线程中执行的,也是里面这么多方法中唯一一个是子线程中执行的,这里一般做的是异步任务要做的事情(也就是耗时的任务),例如访问网络等,都写在这个方法里面。

onPreExecute()

  这个方法是在UI线程中执行的,看方法名也知道个大概了,这个方法是在 doInBackground() 之前调用,也就是异步任务的准备工作等,例如:访问网络前弹出进度条,收集要传递的参数等等。。。

onPostExecute()

  这个和前面的 onPreExecute() 相对应。它是在 doInBackground() 之后执行的,同时也是在UI线程中执行的。这里一般用来做异步任务执行完毕后的操作,例如,Json解析(有些JSON大一点的也会在doInbackground()解析),更新列表,UI上的文字图片等等。。。

onProgressUpdate()

  既然有前有后了,那么就差一个中间的了。没错,这个方法就是在 doInBackground() 执行的过程中回调的一个方法。这个有什么用呢?存在就是有道理的,例如我们下载的时候一般都会告诉你下载了百分之多少,对吧。还有,这个函数也是在UI线程中执行的。

另外还有其他的几个函数 onCancel() 等,这些都不怎么常用,可以稍做理解就可以。没必要深入的去看。

泛型和方法的返回值、参数是啥意思?

函数搞懂什么作用的了,仔细看看,我上面的都没有参数的,实际上是有参数的,对,是有,而且参数很重要。而且,我们继承 AsyncTask 的时候还有 3 个泛型的参数,这又是什么?现在就来看看泛型的参数和方法的参数以及方法的返回值分别是什么意思,并且分别有什么联系?

三个泛型分别是:Params, Progress, Result

Params:故名思议,是参数,也就是外部传递进来的参数,也就是我们执行execute()这个方法传递进来的,同时,可以看到,我们这个泛型和 doInBackground() 所接受的参数的类型是一致的。

Progress:这个参数也很好理解,就是进度,也就是执行过程回调的,我们可以看到 onProgressUpdate() 接收的参数的类型和这个是一致的,没错。就是这样

Result:这个参数也知道什么意思了,结果,也就是子线程的执行的结果,也是 doInBackground() 的返回值的类型,同时也是 onPostExecute() 所接收的参数的类型。

下面来看看参数之间的关系:

先看红色的箭头,红色的箭头表示规定的参数的类型的限制,也就是继承AsyncTask的时候的这 3 个参数类型其实限制的是 doInBackground 、 onProgressUpdate 、onPostExecute 这三个函数的接收的参数的类型和返回值的类型。

再看绿色的箭头,绿色的箭头表示数据的传递的过程。从一开始的execute的时候传递的参数,其实是传递到 doInBackground 里面的,doInBackground 返回的参数,其实是传递到 onPostExecute 。

以上两点是必须要搞清楚的,也是初学者比较难理解的,至于可变参数,初学者可以直接理解成数组,例如 doInBackground 接收的是 String... 你就可以理解成 String[] ,而取值的时候也是以数组的方式进行取值,更多可变参数的内容点击这里

下面我们来通过一个例子来看看实际怎么使用?

代码没什么,就是通过日志去跟踪整个 AsyncTask 的执行的过程。

下面来看看 AsyncTask 的使用和打印的日志:

使用的话,这里直接就 new 了一个异步任务,然后直接调用 execute() 去执行了。

最后来分析分析日志,

onPreExecute() 确实是在 doInBackground() 之前执行,同时我们看传递进去的参数,传递进去的参数,分别是 “123” 、“456”,这里也分别取出来了。然后是执行子线程里面的代码,代码很简单,每休眠 1 秒就往 onProgressUpdate() 发送一次数据,这也可以通过日志看到,每次接收到的参数也分别打印出来,和我们发出去的参数是一致的。最后执行完了,执行完了返回的是 “true”,日志最后一行打印出来的也是true,这也证实了我们前面图上绿色箭头,参数的传递的过程。

整个 AsyncTask 到此解析完毕,下面还有几点需要说明的。

1、AsyncTask只能执行一次,不能执行多次。

2、一旦执行,不可取消,网上说的可以取消的都是骗子,都是骗子,不能取消,解决的唯一途径就是对这次请求的数据不做处理,也就是忽略数据,当作这次没请求,这就需要搞一个标志位去记住是否处理请求回来的数据。

Android-异步任务-AsyncTask的更多相关文章

  1. Android备注26.Android异步任务(AsyncTask)

    转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.引言     我们知道Android的UI线程主要负责处理用户的按键事件.用户触屏事件及屏幕画 ...

  2. Android异步任务AsyncTask

    package com.example.asynctask; import java.net.MalformedURLException; import java.net.URL; import an ...

  3. Android 异步任务——AsyncTask (附使用AsyncTask下载图片Demo)

    我们编程的时候经常需要处理同步任务和异步任务,在Android里面存在一个特性,就是UI线程是不安全的线程.所谓UI线程不安全也就是我们的主线程(进程启动的第一个线程)不能在线程外操作主线程的资源.因 ...

  4. android:异步任务asyncTask介绍及异步任务下载图片(带进度条)

    为什么要用异步任务? 在android中仅仅有在主线程才干对ui进行更新操作.而其他线程不能直接对ui进行操作 android本身是一个多线程的操作系统,我们不能把全部的操作都放在主线程中操作 .比方 ...

  5. 031 Android 异步任务(AsyncTask)

    1.介绍 AsyncTask(了解即可),重点掌握Handler+Thread 2.实现方法 3.执行步骤 4.java后台 package com.lucky.test36asynctask; im ...

  6. android异步任务asyncTask详细分析

    android中的耗时操作需要放在子线程中去执行 asynctask是对Handler和和线程池的封装,直接使用比THread效率更加的高效因为封装了线程池,比我们每次直接new Thread效率更高 ...

  7. Android异步载入AsyncTask具体解释

    曾看见有人说过.认为非常有道理.分享一下:   技术分为术和道两种:   (1)具体做事的方法是术.   (2)做事的原理和原则是道. 近期项目发现个重大问题.结果打log跟踪查是AsyncTask导 ...

  8. [Android]异步任务AsyncTask使用解析

    AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法.注意继承时需要设定三个泛型P ...

  9. Java基础知识强化之网络编程笔记15:Android网络通信之 Android异步任务处理(AsyncTask使用)

         AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的 ...

  10. Android 之异步任务(AsyncTask,Handler,Message,looper)

    AsyncTask: 3个类型(Params,Progress和Result),4个步骤(onPreExecute(),doInBackground(Params…),onProgressUpdate ...

随机推荐

  1. 并查集+树链剖分+线段树 HDOJ 5458 Stability(稳定性)

    题目链接 题意: 有n个点m条边的无向图,有环还有重边,a到b的稳定性的定义是有多少条边,单独删去会使a和b不连通.有两种操作: 1. 删去a到b的一条边 2. 询问a到b的稳定性 思路: 首先删边考 ...

  2. centos yum换阿里云源

    阿里云Linux安装软件镜像源 阿里云是最近新出的一个镜像源.得益与阿里云的高速发展,这么大的需求,肯定会推出自己的镜像源. 阿里云Linux安装镜像源地址:http://mirrors.aliyun ...

  3. 移动web端的react.js组件化方案

     背景: 随着互联网世界的兴起,web前端开发的方式越来越多,出现了很多种场景开发的前端架构体系,也对前端的要求日益增高,早已经不是靠一个JQuery.js来做前端页面的时代了,而今移动端变化最大,近 ...

  4. [资料分享]尚硅谷JavaWeb

    下载链接: 链接:https://pan.baidu.com/s/1pKMclsv 密码:8fbh

  5. bzoj2002弹(dan)飞绵羊 分块水过

    据说是道lct求深度的题 但是在小猫大的指点下用分块就n^1.5水过了 = =数据忘记加强系列 代码极其不美观,原因是一开始是听小猫大讲的题意,还以为是弹到最前面... #include <cs ...

  6. [RxJava^Android]项目经验分享 --- RxLifecycle功能实现分析(一)

      最近在研究RxJava自定义操作符的实现原理,发现成型的项目案例较少.突然想起在项目中应用的RxLifecycle是使用自定义操作符,便拿来研究了一下.分析之前,跟大家了解一些相关操作符和RxLi ...

  7. nginx android app 慢网络请求超时

    最近遇到了android 在慢网络下面请求服务器报 java.net.SocketException: recvfrom failed: ECONNRESET (Connection reset by ...

  8. Linux Shell中单引号、双引号、反引号的区别【转载】

    linux shell可以识别4种不同类型的引字符号: 单引号字符' 双引号字符" 反斜杠字符\ 反引号字符` 1. 单引号 ( '' )# grep Susan phonebook Sus ...

  9. Android软件开发之ListView 详解【转】

    ListView的使用方法  ListView是Android软件开发中非常重要组件之一,基本上是个软件基本都会使用ListView ,今天我通过一个demo来教大家怎么样使用ListView组件 绘 ...

  10. Spring的通知(Advice)

    Spring提供了5种Advice类型: Interception Around:JointPoint前后调用 Before:JointPoint前调用 After Returning:JointPo ...