AsyncTask是一个抽象类,我们在使用时需要定义一个它的派生类并重写相关方法。AsyncTask类的声明如下:

public abstract class AsyncTask<Params, Progress, Result>

我们可以看到,AsyncTask是一个泛型类,它的三个类型参数的含义如下:

Params:doInBackground方法的参数类型;
Progress:AsyncTask所执行的后台任务的进度类型;
Result:后台任务的返回结果类型。

我们再来看一下AsyncTask类主要为我们提供了哪些方法:

onPreExecute() //此方法会在后台任务执行前被调用,用于进行一些准备工作 
doInBackground(Params… params) //此方法中定义要执行的后台任务,在这个方法中可以调用publishProgress来更新任务进度(publishProgress内部会调用onProgressUpdate方法) 
onProgressUpdate(Progress… values) //由publishProgress内部调用,表示任务进度更新 
onPostExecute(Result result) //后台任务执行完毕后,此方法会被调用,参数即为后台任务的返回结果 
onCancelled() //此方法会在后台任务被取消时被调用

以上方法中,除了doInBackground方法由AsyncTask内部线程池执行外,其余方法均在主线程中执行。

2. AsyncTask的局限性

AsyncTask的优点在于执行完后台任务后可以很方便的更新UI,然而使用它存在着诸多的限制。先抛开内存泄漏问题,使用AsyncTask主要存在以下局限性:

在Android 4.1版本之前,AsyncTask类必须在主线程中加载,这意味着对AsyncTask类的第一次访问必须发生在主线程中;在Android 4.1以及以上版本则不存在这一限制,因为ActivityThread(代表了主线程)的main方法中会自动加载AsyncTask 
AsyncTask对象必须在主线程中创建 
AsyncTask对象的execute方法必须在主线程中调用 
一个AsyncTask对象只能调用一次execute方法

使用例子及说明:

    class MyAsyncTask extends AsyncTask<String,Integer,String> {@Overrideprotected void onPreExecute() {super.onPreExecute();Log.i("lgq","sss=s===onPreExecute==");}@Overrideprotected void onCancelled() {//取消该线程方法     myAsyncTask.cancel(false);super.onCancelled();Log.i("lgq","sss=s===onCancelledddd==");}@Overrideprotected void onProgressUpdate(Integer... values) {//进度条回调方法super.onProgressUpdate(values);//通过publishProgress方法传过来的值进行进度条的更新.
//            progressBar.setProgress(values[0]);Log.i("lgq","sss=s====="+values[0]);}@Overrideprotected void onPostExecute(String aVoid) {//doInBackground结果回调方法super.onPostExecute(aVoid);Log.i("lgq","........"+aVoid);}@Overrideprotected String doInBackground(String... params) {//参数类型是AsyncTask最后一个参数类型//使用for循环来模拟进度条的进度.for (int i = 0;i < 100; i ++){//调用publishProgress方法将自动触发onProgressUpdate方法来进行进度条的更新.
//                ab++;publishProgress(i);//加载进度条方法try {//通过线程休眠模拟耗时操作Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}return params[0];}}

启动AsyncTask

MyAsyncTask myAsyncTask;
myAsyncTask  = new MyAsyncTask();
myAsyncTask.execute("ssssw232e3");//这个参数会传递到doInBackground里面

类型后面三个点(String…),是从Java 5开始,Java语言对方法参数支持一种新写法,叫可变长度参数列表

在使用的时候,对于test(String…strings),你可以直接用test()去调用,标示没有参数,也可以用去test(“aaa”),也可以用test(new String[]{“aaa”,”bbb”})。

doInBackground(String... params),onProgressUpdate(Integer... values)参数都是数组类型

AsyncTask使用详解相关推荐

  1. 多线程之 AsyncTask 使用详解和从源码中深入理解 AsyncTask 机制

    前言 AsyncTask是Android提供的一个助手类,它对Thread和Handler进行了封装,方便我们使用: Android之所以提供AsyncTask这个类,就是为了方便我们在后台线程中执行 ...

  2. Android之AsyncTask异步任务详解总结

    Android 多线程----AsyncTask异步任务详解 [正文] 本文将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信. 一.Android当中的多 ...

  3. Android异步处理三:Handler+Looper+MessageQueue深入详解

    本博文地址:http://blog.csdn.net/mylzc/article/details/6771331 转载请注明出处 Android异步处理系列文章索引 Android异步处理一:使用Th ...

  4. 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)

    作者 : 韩曙亮  博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csd ...

  5. android 之多线程详解

    Android 中进程的生命周期: <1>前台进程(Foreground process):正在运行着和用户交互的程序的进程 <2>可见进程(visible process): ...

  6. Android Loader 异步加载详解二:探寻Loader内部机制

    Android Loader 异步加载详解二:探寻Loader内部机制 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/7025991 ...

  7. Android Loader 异步加载详解一:基础概念

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70241844 本文出自[赵彦军的博客] Android Loader 异步加载详解 ...

  8. android ------- 开发者的 RxJava 详解

    在正文开始之前的最后,放上 GitHub 链接和引入依赖的 gradle 代码: Github:  https://github.com/ReactiveX/RxJava  https://githu ...

  9. Java 线程池详解及实例代码

    转载自  Java 线程池详解及实例代码 这篇文章主要介绍了Java 线程池的相关资料,并符实例代码,帮助大家学习参考,需要的朋友可以参考下 线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时 ...

最新文章

  1. 跳表(SkipList)设计与实现(java)
  2. 微信小程序-WebSocket应用
  3. 前端自动化测试工具:SlimerJS、phantomJS 和 CasperJS
  4. 安卓USB开发教程 四 安卓 AOA
  5. 工作中影响提高的一些想法
  6. 继扫楼推广后,P图病历也可发起筹款,水滴筹回应...
  7. python输入二维数组_python 二维数组键盘输入
  8. Flask 验证模式
  9. 私有变量访问/延后执行代码块
  10. nginx详解反向代理,负载均衡,LNMP架构上线动态网站
  11. 使用 Vi/Vim 编辑器:基础篇
  12. 亿图脑图-MindMaster-思维导图及亿图图示会员-史上超值活动
  13. 8种经典的统计学悖论18种经典的哲学悖论
  14. 采样频率-控制频率-开关频率
  15. c语言:用二分法求方程在(-10,10)之间的根:2x^3-4x^2+3x-6=0.
  16. 如何查询手机屏幕尺寸、密度,分辨率
  17. 智能客服搭建(1) - MRCP Server 搭建
  18. github分支操作
  19. Object.assign()的详解和用法
  20. MySQL 主从复制类型及详解

热门文章

  1. 工作226:for循环逻辑
  2. 前端学习(2253)如何进行团队合作
  3. 前端学习(1422):ajax获取服务器端的响应
  4. (总结)HTTP常见错误返回代码
  5. CSS之Multi-columns的列数和列宽
  6. [机器学习笔记] Note2--单变量线性回归
  7. GStreamer基础教程07 - 播放速率控制
  8. docker版本Mysql安装
  9. 常用的HTML标签(超文本标记语言)
  10. HOJ 13828 Funfair