AsyncTask官方文档教程整理
作者:SAKA 发布时间:2023-07-31 20:25:08
简介
Android给我们提供了一种轻量级的异步任务类AsyncTask。该类中实现异步操作,并提供接口反馈当前异步执行结果及进度,这些接口中有直接运行在主线程中的(如 onPostExecute,onPreExecute等)。
AsyncTask可以轻松正确的使用UI线程,这个类允许你在后台操作,并且不需要使用threads或者handler将结果发布到UI线程。
AsyncTask设计之初就是辅助Thread和Handler的,并且不会生成线程。AsyncTask应该被用于短时间内的操作(最多几秒钟),如果你想要长时间保持线程运行,请使用Executor或者ThreadPoolExecutor或者FutureTask。
AsyncTask在后台运行任务,在UI线程发布结果,定义三个参数,Params, Progress和Result,执行四个步骤,onPreExecute, doInBackground, onProgressUpdate和onPostExecute。
使用方法
AsyncTask必须被继承来使用。子类必须实现至少一个方法(ddoInBackground(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 called
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);
AsyncTasks的范型参数
异步任务使用的参数是:
Params, 启动任务时传入的参数
Progress, 在后台任务执行时发布到UI线程的进度类型
Result, 后台任务执行完成的结果
这三个参数不一定非要指定,可以使用Void来传入空值。
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
4个步骤
onPreExecute()
,在应用程序执行前在UI线程上调用。这步通常被用来准备任务开始,例如显示一个进度条。doInBackground(Params…)
,在onPreExecute()
方法被调用后立即执行此方法,用来执行长时间的任务。参数会在这一步传入,最后的结果必须返回。在这步页可以使用
publishProgress(Progress...)
来发布进度,这些值时在UI线程中发布的,在onProgressUpdate(Progress...)
接收。onProgressUpdate(Progress…)
, 在publishProgress(Progress...)
方法调用后在UI线程调用此方法。执行时间未定义。该方法用于在后台计算仍在执行时,用户界面中显示的进度。例如,它可以用于对进度条进行动画处理或在文本字段中显示日志。onPostExecute(Result)
,在后台计算完成后在UI线程上调用。 后台计算的结果作为参数传递给该步骤。
取消异步任务
任何时候都可以通过调用cancel(boolean)
方法来取消任务。
调用此方法将导致对isCancelled()
的后续调用返回true。
调用此方法后,onCancelled(Object)
,而不调用onPostExecute(Object)
为了尽可能快地取消任务,应该始终从doInBackground(Object [])
中定期检查isCancelled()
的返回值(如果可能的话)。
线程规则
必须在UI线程上加载AsyncTask类。
必须在UI线程上创建任务实例。
必须在UI线程上调用
execute(Params …)
不要手动调用
onPreExecute()
,onPostExecute(Result)
,doInBackground(Params …)
,onProgressUpdate(Progress …)
。该任务只能执行一次(如果尝试第二次执行,将抛出异常)。
内存监控
AsyncTask保证所有回调调用都是同步的,使得以下操作在没有显式同步的情况下是安全的。
在构造函数或
onPreExecute()
中设置成员字段,并在doInBackground(Params …)
中引用它们。在
doInBackground(Params …)
中设置成员字段,并在onProgressUpdate(Progress …)
和onPostExecute(Result)
中引用它们。
执行顺序
首次引入时,AsyncTasks在单个后台线程上串行执行。
从DONUT开始,这被更改为一个允许多个任务并行操作的线程池。
从HONEYCOMB开始,任务在单个线程上执行,以避免并行执行引起的常见应用程序错误。
如果真的需要并行执行,则可以使用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor,Object [])
。
来源:https://rgf456.github.io/2017/04/02/AsyncTask官方文档/
猜你喜欢
- 大致分为以下几个方面:一些查询指令整理使用SQL语句进行特殊查询检测表字段是否存在数据库升级数据库表字段赋初始值一、查询指令整理1.链式执行
- 前言上一篇我们认识了Kotlin编程语言,也搭建好开发环境。本篇就进入Kotlin的基础语法介绍,与其他编程语言一样,Kotlin也有自己的
- [LeetCode] 3. Longest Substring Without Repeating Characters 最长无重复字符的子
- 前言gps定位服务的学习是这段时间gps课程的学习内容,之前老师一直在将概念,今天终于是实践课(其实就是给了一个案例,让自己照着敲).不过在
- SlidingDrawer效果想必大家也见到过,它就是1.5模拟器上进入应用程序列表的效果。下面是截图一、简介 SlidingDr
- 什么是异步?为什么要用它?异步编程提供了一个非阻塞的,事件驱动的编程模型。 这种编程模型利用系统中多核执行任务来提供并行,因此提供了应用的吞
- 介绍Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。Spring Cache提供了一
- 解决方法有如下两种:第一种如果你 repo sync 了 android 的整个源码,那么可以直接把你的 app 放到 /packages/
- 要实现摇一摇的功能,类似于微信的摇一摇方法1:通过分析加速计数据来判断是否进行了摇一摇操作(比较复杂)方法2:iOS自带的Shake监控AP
- 一、百度百科Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防
- 本文实例讲述了C#实现Base64处理的加密解密,编码解码。分享给大家供大家参考,具体如下:using System;using Syste
- 一、Monkey 是什么?Monkey 就是SDK中附带的一个工具。二、Monkey 测试的目的?:该工具用于进行压力测试。 然后开发人员结
- 在观察者模式中有2个要素:一个是被观察对象,另一个是观察者。但被观察对象的状态发生改变会通知观察者。举例:把订阅报纸的人看作是观察者,把报纸
- 1、volley 项目地址 https://github.com/smanikandan14/Volley-demo (1)&nb
- 简要:EigenFace是基于PCA降维的人脸识别算法,PCA是使整体数据降维后的方差最大,没有考虑降维后类间的变化。 它是将图像
- 1、取得控制台应用程序的根目录方法方法1、Environment.CurrentDirectory 取得或设置当前工作目录的完整限定路径方法
- 在实际开发中,我们经常会需要在页面跳转的时候携带路由参数,典型的例子就是从列表到详情页的时候,需要携带详情的 id,以便详情页获取对应的数据
- 右击有main方法的类===> Run as===> Run Configurations ===>双击java
- 最近要给一个 Winform 项目添加功能,需要一个能显示进度条的弹窗,还要求能够中止任务,所以就做了一个,在此做个记录总结。虽然用的是比较
- 本文实例为大家分享了Android绝对布局AbsoluteLayout的具体代码,供大家参考,具体内容如下1>AbsoluteLayo