异步任务学习

这两天使用到特别多的AsyncTask类,一块来学习一下吧

AsyncTask允许更方便和简单使用UI线程,这个类允许你在UI线程中进行后台操作和展示结果,而无需操作Thread或者handlers

AsyncTask是围绕ThreadHandler设计的辅助类,并不构成通用线程框架。AsyncTask最适合的场景是短时间操作(最好几秒钟),如果你需要保持长时间的运行,建议你使用java.util.concurrent包提供的API,比如ExecutorThreadPoolExecutorFutureTask

一个异步任务是由三个泛型参数(Params,Progress,result)和四个步骤(onPreExecute,doInBackgroud,onProgressUpdate,onPostExecute)组成

最简单的使用时必须重写(doInBackgroud(Params...))和最常重写(onPostExecute)方法,比如如下例子

private class DownloadFilesTask extends AsyncTask<URL,Integer,Long>{
protected Long doInBackground(URL... urls){
int count = urls.length;
long totalSize = 0;
for(int i = 0; i< count;i++){
totalSize += Downloader.downloadFile(urls[i]);
publicProgress((i/(float)count)*100));
//如果cancel调用的话提前退出
if(isCancelled()) break;
}
return totalSize;
} protected void onProgressUpdate(Integer... progress){
setProgressPercent(progress[0]);
} protected void onPostExecute(Long result){
showDialog("Downloaded"+result+" bytes");
}
}

调用也非常简单

new DownloadFilesTask().execute(url1,url2,url3);

AsyncTask的三个泛型参数

  • Params

    代表衣服任务的执行参数,需要传到doInBackground里面的参数

  • Progress

    后台任务执行的进度单位,可以放在进度条中

  • Result

    任务执行完成返回的结果。在onPostExecute的参数就是

三个参数不是必须要有的,也可以

private class MyTask extends AsyncTask<Void,Void,Void>{...}

AsyncTask的四个步骤

  1. onPreExecute()

    在任务执行前被UI线程调用。通常被用来进行任务的一些设置,比如在用户界面显示一个进度条

  2. doInBackground(Params...)

    在onPreExecute()结束后被后台线程调用,这个步骤被用来放置实际的任务,前面提到的Params参数被传递到这里。前面提到的result参数必须在此步骤中返回,并且传递到最后一步。这里也可以使用publicProgress(Progress...)通知执行的进度。

  3. onProgressUpdate(Progress...)

    方法在执行publishProgress(Progress...)之后被UI线程调用。这一步可以在用户界面显示任务执行的进度。例如这里通常显示一个进度条或者打印日志字段

  4. onPostExecute(Result)

    在后台任务完成之后被UI线程调用,后台的结果result参数传递到这个方法中

取消任务

可以通过调用cancel(boolean)方法取消任务,调用之后isCancelled()会返回True。在调用此方法之后,onPostExecute(object)将不再执行,取而代之的是onCancelled(object)。为了确保任务趋势被取消了,你应该在doInBackground(object[])始终检查isCancelled()的值。

一些规则

有一些规则是需要被遵守

  • AsynacTask类必须在UI线程中加载
  • 任务(task)实例必须在UI线程中被创建
  • execute()方法必须被UI线程调用
  • 不要手动调用onPreExecute()onPostExecute(result)doInBackground(Params...)onProgressUpdate(Progress...)
  • 任务只能被执行一次

具体的参数意义请参见官方文档

AsyncTask官方学习的更多相关文章

  1. .Net 官方学习文档

    .Net 官方学习文档:https://docs.microsoft.com/zh-cn/dotnet/articles/welcome

  2. 《CWNA官方学习指南(第3版):认证无线网络管理员PW0-105》

    <CWNA官方学习指南(第3版):认证无线网络管理员PW0-105> 基本信息 原书名:CWNA: Certified Wireless Network Administrator Off ...

  3. 【声明】前方不设坑位,不收费!~ 我为NET狂官方学习计划

    发个通知,过段时间学习计划相关的东西就出来了,上次写了篇指引文章后有些好奇心颇重的人跟我说:“发现最近群知识库和技能库更新的频率有点大,这是要放大招的节奏啊!” 很多想学习却不知道如何规划的人想要一个 ...

  4. json官方学习档案

    项目经常用json开发,但说实话,对json了解的一直不深入.今天看了下json的官方资料,明了很多. json官方网址:http://www.json.org/json-zh.html JSON(J ...

  5. AsyncTask的学习

    具体的用法请看我之前的一篇随笔,用php+mysql+json实现用户反馈. AsyncTask的目标是为你的线程提供管理服务. AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,这些方 ...

  6. AsyncTask机制学习

    其内容可以参考http://blog.csdn.net/webgeek/article/details/17298237 ,首先创建一个AsyncTask类 class GetFaceDetectTa ...

  7. AsyncTask官方教程-推荐用AsyncTask少用Thread

    Using AsyncTask AsyncTask allows you to perform asynchronous work on your user interface. It perform ...

  8. microsoft 官方学习资源

    https://devblogs.microsoft.com/dotnet/  :_NET Blog https://docs.microsoft.com/zh-cn/learn/ :Microsof ...

  9. JQuery官方学习资料(译):使用JQuery的.index()方法

        .index()是一个JQuery对象方法,一般用于搜索JQuery对象上一个给定的元素.该方法有四种不同的函数签名,接下来将讲解这四种函数签名的具体用法. 无参数的.index() < ...

随机推荐

  1. ZOJ Problem Set - 1001 A + B Problem

    ZOJ ACM题集,编译环境VC6.0 #include <stdio.h> int main() { int a,b; while(scanf("%d%d",& ...

  2. Struts2环境下Tomcat启动异常:Exception starting filter struts2,报了一个java.lang.ClassNotFoundException

    在写一个struts2+hibernate整合的小例子时,启动Tomcat服务器,报了一个: 严重: Exception starting filter struts2java.lang.ClassN ...

  3. 重温JSP学习笔记--JSP动作标签

    上一篇笔记写的是jsp的三个指令九个内置对象,这篇随笔开始写jsp的动作标签,动作标签是由服务器(Tomcat)来解释执行,与java代码一样,都是在服务器端执行的,jsp动作标签有十几多个,这里只写 ...

  4. java多线程等待协调工作:CountDownLatch类的高级应用

    一:说明 基本上对于线程初步了解的人,都是使用synchronized来同步线程的,也确实,它也是可以满足一些常用的问题.那么我们来说一些它不能解决的问题(其实是不怎么好解决的问题,并不是真的不能解决 ...

  5. JS验证图片格式和大小并预览

    用于上传图片的js验证: <%@ page language="java" contentType="text/html; charset=UTF-8"p ...

  6. 程序集与反射技术(C#)

    首先我们来看程序集,程序集是代码进行编译是的一个逻辑单元,把相关的代码和类型进行组合,然后生成PE文件(例如可执行文件.exe和类库文件.dll).由于程序集在编译后并不一定会生成单个文件,而可能会生 ...

  7. C#使用Graphics画圆写字

    画填充圆: Graphics gra = this.pictureBox1.CreateGraphics(); gra.SmoothingMode = System.Drawing.Drawing2D ...

  8. 初入网络系列笔记(6)TFTP协议

    一.借鉴说明,本博文借鉴以下博文 1.锤子,FTP协议,http://www.cnblogs.com/loadrunner/archive/2008/01/09/1032264.html 2.suna ...

  9. 使用canvas实现擦玻璃效果

    体验效果:http://hovertree.com/texiao/html5/25/ 效果图: 代码如下: <!DOCTYPE html> <html> <head la ...

  10. Hibernate 更新部分字段的实现

    在Hibernate 中,有时我们只需要更新部分字段,此时如果使用update()方法,会将所有字段都更新,对于没有set的字段,就会设置成NULL,如果这些字段里面有非空的字段就会报错. 解决的方法 ...