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 ...
随机推荐
- 切图时图片的选择:JPG、PNG、GIF的区别
目前网站图片的采用一共有流行三种,分别是JPG.PNG.GIF,然而很多人并不知道三者在选择的时候究竟应该选谁.虽然都可以存储图片,但是如果要发布到网上,就必须考虑速度.大小和失真程度的问题.如果你运 ...
- React 编程思想翻译及学习笔记
第一步:把UI图按组件层次结构拆分开 FilterableProductTable (橙色): 包含整个例子 SearchBar (蓝色): 接收所有用户输入 ProductTable (绿色): 基 ...
- 代码中使用StoryBoard和DoubleAnimation的方法
TranslateTransformを対象に.DoubleAnimation型のアニメーションを使用して.TranslateTransform.Xプロパティを ”-1 * Imageコントロールの幅” ...
- 热浪[TYVJ1031]
描述 德克萨斯纯朴的民眾们这个夏天正在遭受巨大的热浪!!!他们的德克萨斯长角牛吃起来不错,可是他们并不是很擅长生產富含奶油的乳製品.Farmer John此时以先天下之忧而忧,后天下之乐而乐的精神,身 ...
- Nonblocking I/O and select()
This sample program illustrates a server application that uses nonblocking and the select() API. Soc ...
- Web API Get Started First
注:此博客是自官网修剪而来,博主IT新手 一.web api与web service的不同: web api是基于Http协议,而web service是基于soap协议.两协议的区别小子看了很多,但 ...
- iOS 清除缓存
iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒.它包含三个文件夹: Documents: 苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下 ...
- jquery简单插件写法
(function($){ /** * 遮罩插件 * 使用:$('#id').qloading(options); * 详见:/plugins/_11_qloading/qloading.html * ...
- js二进制与十进制互转
十进制转换为二进制: var num = 100; console.log(num.toString(2)); toString()方法可把一个 Number 对象转换为一个字符串,并返回结果. 语法 ...
- Python操作Mysql数据库时SQL语句的格式问题
一.概述 近日使用Python对Mysql数据库进行操作,遇到SQL语句死活出问题的情况.由于最初没有将异常打印出来,一直不知道原因.随后,将异常打印出来之后,通过异常信息,对代码进行修改.最终,成功 ...