Android 解析AsyncTask(一)
Android 解析AsyncTask(一)
大家都知道在开发Android中涉及到UI的修改都必须在UI线程中操作,并且执行耗时的操作绝不能在UI线程上干,一般使用线程或者开启线程池处理。如果要把耗时的任务执行的结果显示到UI上,也许会使用Thread+Handler这种方式来处理,但是个人感觉其内聚性不是很高。而AsyncTask非常适合上述应用场景,它其实是Thread+Handler的结合体,通过它你可以执行耗时的操作,并把结果转移到UI线程中,甚至可以显示执行进度,下面阐述下它的基本使用方法。
使用
AsyncTask是个抽象类,如果你使用的话必须要实现doInBackground(Params…)方法,一般的话你也要复写onPostExecute(Result),下面给出一个简单的样例
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]);publishProgress((int) ((i / (float) count) * 100));// Escape early if cancel() is calledif (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的三种参数类型
当你继承AsyncTask时需要你指定三种参数类型
Params, 就是AsyncTask执行时接受的可变参数类型,
也是方法doInBackground传入的参数类型Progress 进度更新时传入的参数也是方法
publishProgress、onProgressUpdate传入的参数Result 后台执行后返回的数据类型
如果你觉得不需要参数的话,你可以都用Void来代替
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
AsyncTask执行的四步
当一个异步任务被执行时,AsyncTask会执行下述四个步骤:
onPreExecute(),
该方法会在UI线程中调用并且是在任务被执行前调用,你可以在这里去创建一个对话框显示其进度或者提示信息。doInBackground(Params…),
当onPreExecute()调用结束后该方法立马被执行并且是运行在后台线程中。所以你可以在该方法中执行耗时的操作比如网络的请求,文件下载等等。该方法的参数就是你传入给AsyncTask的参数,执行后会返回结果,并会把结果传递给第四步。你可以在该方法中调用publishProgress(Progress…)去发布进度信息,该进度信息会被转移到onProgressUpdate(Progress…)方法中。onProgressUpdate(Progress…),
调用publishProgress(Progress…)后该方法会在UI线程中被调用,该方法能够显示后台任务执行的进度消息等。onPostExecute(Result),
后台任务执行完毕后将调用该方法,并将计算的结果以参数的形式转移给该方法。
取消一个任务
你可以通过调用cancel(boolean)来取消任务,调用它后onCancelled(Object)将会在doInBackground(Object[]) 返回之后被调用,onPostExecute(Object)则不会执行,为确保任务能够被及时取消,建议取消前使用isCancelled()方法判断当前任务是否被取消。
注意事项
- AsyncTask必须在UI线程创建,且方法execute(Params…) 也必须在UI线程中使用
- 不要手动调用 onPreExecute(), onPostExecute(Result), doInBackground(Params…), onProgressUpdate(Progress…) 方法
- 任务仅仅能被执行一次,如果调用多次execute方法将会抛出异常
Android 解析AsyncTask(一)相关推荐
- 【Android】AsyncTask原理应用及源码关键部分解析
为了更加方便我们在子线程中更新UI元素,Android从1.5版本就引入了一个AsyncTask类,使用它就可以非常灵活方便地从子线程切换到UI线程.AsyncTask是android提供的轻量级的异 ...
- Android通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比
在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一是 ...
- Android 解析软件包时出现问题 -- Error staging apk from content URI
Android Version : 8.1 使用场景 : 在Rk3288w Android 8.1 的测试设备上安装 "文件管理器" 应用程序 , 若打开***.apk文件,会出现 ...
- android定义 task,Android中AsyncTask的基本用法
首先: 了解一个知识点的用法,可以分四步: 第一:what是指AsyncTask的概念,从服务器下载资源,解析json文件,在开发Android应用时必须遵守单线程模型的原则: Android UI操 ...
- Android 利用 AsyncTask 异步读取网络图片
1.新建Android工程AsyncLoadPicture 新建布局文件activity_main.xml主界面为一个ListView 2.功能主界面MainActivity.java,主代码如下 p ...
- 【Android】AsyncTask异步类
一.关于AysncTask AsyncTask使得多线程编程更加简单,AsyncTask能在后台线程执行异步任务,并且在UI线程更新界面,而不再需要用户去操作Thread和Handler.AysncT ...
- Android 解析包出错问题
2019独角兽企业重金招聘Python工程师标准>>> Android 解析包出错问题 app上线后经常会遇到安装包解析出错问题,今天刚好做个不完整的总结, 解决问题 检测系统是否开 ...
- Android解析WindowManagerService(二)WMS的重要成员和Window的添加过程
前言 在本系列的上一篇文章中,我们学习了WMS的诞生,WMS被创建后,它的重要的成员有哪些?Window添加过程的WMS部分做了什么呢?这篇文章会给你解答. 1.WMS的重要成员 所谓WMS的重要成员 ...
- Android解析WindowManagerService(三)Window的删除过程
相关文章 Android系统启动系列 Android深入四大组件系列 Android应用进程启动过程系列 Android解析WindowManager系列 前言 在本系列文章中,我提到过:Window ...
最新文章
- MySQL提权简单方法
- 【编程通识】PlantUML绘制时序图样例
- 疫情过后,2020年各省市GDP排行榜top10新鲜出炉,你的家乡排在第几?
- ASP.Net中无刷新执行Session身份验证
- jeecg自定义datagrid查询
- html body最小高度,CSS网页布局中的最小高度问题的解决方法
- 海量数据挖掘MMDS week2: 频繁项集挖掘 Apriori算法的改进:非hash方法
- 浅入深出Vue:数据渲染
- 人一生的8种朋友(看看身边的朋友属于哪种)
- oracle应付模块中的ov,oracle常用dba命令和知识下
- 2021计算机考研总结即经验贴(初试、复试、调剂、心态调整)
- 计算机编程及常用术语英语词汇大全
- 计算机本地连接怎么找不到了,电脑本地连接不见了该怎么办
- Echarts 图表不能渲染问题整理
- Chapter~3 Python基础
- 通过jmeter进行用户并发(vu/s)测试
- 小猫爪:S32K3学习笔记01-S32K3 RTD【MCALSDK】的使用和环境搭建
- iphonex美版型号对照表_iPhoneX国行和美版/港版/日版哪个好?苹果X各国家版本区别对比...
- 运维基本功(十二): Linux命令回顾与扩展
- Source Insight常用配置
热门文章
- koreader下载_koreader下载_koreader安装_koreader最新版_koreader安卓版下载_koreader app_易玩网...
- centos编译安装python_centos编译安装python3.6.4
- C语言写一个简单的数学程序,用C语言计算简单的数学式子
- Java使用Proxy和CGLib实现动态代理
- android 网络图片查看器,Handler的用法
- 【小白学习keras教程】六、基于CIFAR-10数据集训练CNN-RNN神经网络模型
- 股票系列,动态规划,加油,九月太浪了,十月不许浪
- 博后招募 | 新加坡国立大学WING实验室招募自然语言处理方向博士后
- 复旦大学邱锡鹏教授团队:Transformer最新综述
- Bengio、周志华、山世光、包云岗等200+位AI学术领袖邀你观看智源大会精彩论坛...