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官方文档/


猜你喜欢
- 1:首先。创建一个springboot项目,这里我使用以及构建好基本框架的脚手架,打开是这个样子:Result类:已经封装好了三种返回类型的
- 每个使用Android手机的人应该对Android中的通知不陌生,下面我们就学习一下怎么使用Android中的通知。一、通知的基本用法活动、
- 前言在mybatis和mybatis plus里,如果你的实体字段是一个枚举类型,而在数据表里是整型,这时在存储时需要进行处理,默认情况下,
- Unity3D游戏引擎介绍Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三
- 1.先看源码文档/** * Indicates that an annotation type is automatically inher
- @SuppressWarnings 注解@SuppressWarnings: 抑制编译器警告如下,可以看到idea中有警告的颜色标注当我们不
- 前言:一个游戏里的一个人物会存在多种状态,那么就需要有一个专门管理这些状态的类。不然会显得杂乱无章,不易于后面状态的增加或者减少。思路:既然
- 我们在学习接口的时候。能够在里面做一些方法的调用。不过今天所要讲的JDBC,虽然也是连接数据库的一种接口,不过与类接口有着很大的区别,大家要
- 本文实例讲述了java实现清理DNS Cache的方法。分享给大家供大家参考。具体分析如下:一、测试环境OS:Windows7 x64JDK
- 1.单个词语System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.To
- 本文实例讲述了Java实现爬取百度图片的方法。分享给大家供大家参考,具体如下:在以往用java来处理解析HTML文档或者片段时,我们通常会采
- vs2010测试通过,主要思想是由出生日期和当前日期,两个日期计算出年龄(岁、月、天)using System;using System.C
- 协程属于Kotlin中非常有特色的一项技术,因为大部分编程语言中是没有协程这个概念的。那么什么是协程呢?它其实和线程有点相似,可以简单地将它
- Canvas绘制文本时,使用FontMetrics对象,计算位置的坐标。public static class FontMetrics {
- 废话不多说,直接上代码package com.ncu.list;/** * * 顺序结构线性列表 *&nbs
- 如果不熟悉Java8新特性的小伙伴,初次看到函数式接口写出的代码可能会是一种懵逼的状态,我是谁,我在哪,我可能学了假的Java,(・∀・(・
- 题外话:学习.NET已经有一年了,从C#->ASP.NET->WPF。主要以看电子书为主,比较少写代码。现在回头学习以前接触过的
- 一、概要介绍 本文要介绍的是Java中的transient关键字,transient是短暂的意思。对于transie
- 我们知道 Spring Boot 已经提供了一套默认的异常处理机制,但是 Spring Boot 提供的默认异常处理机制却并不一定适合我们实
- 在Springboot项目中使用分页插件的时候 发现PageHelper插件失效了我导入的是:后来才发<dependency>