Android-异步任务-AsyncTask
什么是异步任务?
异步任务就是开一个子线程,然后让它去跑,它跑完了就会回来告诉你说,它跑完了,这是结果。这和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的更多相关文章
- Android备注26.Android异步任务(AsyncTask)
转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.引言 我们知道Android的UI线程主要负责处理用户的按键事件.用户触屏事件及屏幕画 ...
- Android异步任务AsyncTask
package com.example.asynctask; import java.net.MalformedURLException; import java.net.URL; import an ...
- Android 异步任务——AsyncTask (附使用AsyncTask下载图片Demo)
我们编程的时候经常需要处理同步任务和异步任务,在Android里面存在一个特性,就是UI线程是不安全的线程.所谓UI线程不安全也就是我们的主线程(进程启动的第一个线程)不能在线程外操作主线程的资源.因 ...
- android:异步任务asyncTask介绍及异步任务下载图片(带进度条)
为什么要用异步任务? 在android中仅仅有在主线程才干对ui进行更新操作.而其他线程不能直接对ui进行操作 android本身是一个多线程的操作系统,我们不能把全部的操作都放在主线程中操作 .比方 ...
- 031 Android 异步任务(AsyncTask)
1.介绍 AsyncTask(了解即可),重点掌握Handler+Thread 2.实现方法 3.执行步骤 4.java后台 package com.lucky.test36asynctask; im ...
- android异步任务asyncTask详细分析
android中的耗时操作需要放在子线程中去执行 asynctask是对Handler和和线程池的封装,直接使用比THread效率更加的高效因为封装了线程池,比我们每次直接new Thread效率更高 ...
- Android异步载入AsyncTask具体解释
曾看见有人说过.认为非常有道理.分享一下: 技术分为术和道两种: (1)具体做事的方法是术. (2)做事的原理和原则是道. 近期项目发现个重大问题.结果打log跟踪查是AsyncTask导 ...
- [Android]异步任务AsyncTask使用解析
AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个类,然后调用execute()方法.注意继承时需要设定三个泛型P ...
- Java基础知识强化之网络编程笔记15:Android网络通信之 Android异步任务处理(AsyncTask使用)
AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的 ...
- Android 之异步任务(AsyncTask,Handler,Message,looper)
AsyncTask: 3个类型(Params,Progress和Result),4个步骤(onPreExecute(),doInBackground(Params…),onProgressUpdate ...
随机推荐
- Python爬虫学习(9):Selenium的使用
1 简介以及安装 Selenium 是什么?一句话,自动化测试工具.它支持各种浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,如果你在这些浏览器里面安装一个 Seleni ...
- three.js贴图
使用图像作为材质.这时候,就需要导入图像作为纹理贴图,并添加到相应的材质中 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//E ...
- 使用Android Butterknife
我之前浏览过android butterknife 的使用 在android studio 中,很惊喜,已经成为一个插件来使用 这个android butterknife 最大的用处,就是直接生成la ...
- CentOS6.5的vsftp搭建流程(一)
前几次搭建FTP都失败了,不是登陆不了,就是目录没有权限.现在终于摸索出了靠谱的操作流程,分享之~ 1. 查看是否安装了vsftpd,未安装则安装 [root@iZ283tian2dZ /]# rpm ...
- dom4j解析示例
收藏信息.xml <?xml version="1.0" encoding="GB2312" standalone="no"?> ...
- EF DbContext 并发执行时可能出现的问题
现在许多Web项目都使用了IOC的DI注入组件.其中对象的生命周期管理是非常重要的. 有时我们为了提高请求的响应,经常在请求线程中执行多个子线程,然而忽略了EF的DbContext的生命周期管理. D ...
- canvas小结
前段时间在公司没什么事干,研究了一下canvas,在实际开发中还没正式应用过,但是已经深深感觉到其魅力之处.下面写一写我认为canvas中比较重要的点,如有理解错误,欢迎指正. 首先canvas是h5 ...
- POI3.8解决导出大数据量excel文件时内存溢出的问题
POI3.8的SXSSF包是XSSF的一个扩展版本,支持流处理,在生成大数据量的电子表格且堆空间有限时使用.SXSSF通过限制内存中可访问的记录行数来实现其低内存利用,当达到限定值时,新一行数据的加入 ...
- 简单谈谈如何利用h5实现音频的播放
作者:白狼 出处:http://www.manks.top/article/h5_audio本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律 ...
- laravel中TokenMismatchException异常处理
在使用post或者put等方法请求时,有时会报TokenMismatchException in VerifyCsrfToken.php line 67错误.原因是laravel默认开启了防CSRF. ...