AsyncTask使用详解
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使用详解相关推荐
- 多线程之 AsyncTask 使用详解和从源码中深入理解 AsyncTask 机制
前言 AsyncTask是Android提供的一个助手类,它对Thread和Handler进行了封装,方便我们使用: Android之所以提供AsyncTask这个类,就是为了方便我们在后台线程中执行 ...
- Android之AsyncTask异步任务详解总结
Android 多线程----AsyncTask异步任务详解 [正文] 本文将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信. 一.Android当中的多 ...
- Android异步处理三:Handler+Looper+MessageQueue深入详解
本博文地址:http://blog.csdn.net/mylzc/article/details/6771331 转载请注明出处 Android异步处理系列文章索引 Android异步处理一:使用Th ...
- 【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csd ...
- android 之多线程详解
Android 中进程的生命周期: <1>前台进程(Foreground process):正在运行着和用户交互的程序的进程 <2>可见进程(visible process): ...
- Android Loader 异步加载详解二:探寻Loader内部机制
Android Loader 异步加载详解二:探寻Loader内部机制 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/7025991 ...
- Android Loader 异步加载详解一:基础概念
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/70241844 本文出自[赵彦军的博客] Android Loader 异步加载详解 ...
- android ------- 开发者的 RxJava 详解
在正文开始之前的最后,放上 GitHub 链接和引入依赖的 gradle 代码: Github: https://github.com/ReactiveX/RxJava https://githu ...
- Java 线程池详解及实例代码
转载自 Java 线程池详解及实例代码 这篇文章主要介绍了Java 线程池的相关资料,并符实例代码,帮助大家学习参考,需要的朋友可以参考下 线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时 ...
最新文章
- 跳表(SkipList)设计与实现(java)
- 微信小程序-WebSocket应用
- 前端自动化测试工具:SlimerJS、phantomJS 和 CasperJS
- 安卓USB开发教程 四 安卓 AOA
- 工作中影响提高的一些想法
- 继扫楼推广后,P图病历也可发起筹款,水滴筹回应...
- python输入二维数组_python 二维数组键盘输入
- Flask 验证模式
- 私有变量访问/延后执行代码块
- nginx详解反向代理,负载均衡,LNMP架构上线动态网站
- 使用 Vi/Vim 编辑器:基础篇
- 亿图脑图-MindMaster-思维导图及亿图图示会员-史上超值活动
- 8种经典的统计学悖论18种经典的哲学悖论
- 采样频率-控制频率-开关频率
- c语言:用二分法求方程在(-10,10)之间的根:2x^3-4x^2+3x-6=0.
- 如何查询手机屏幕尺寸、密度,分辨率
- 智能客服搭建(1) - MRCP Server 搭建
- github分支操作
- Object.assign()的详解和用法
- MySQL 主从复制类型及详解