关于AsyncTask的使用

#Linux内存管理# 用一个案例详细介绍ARMv7-A架构 缺页中断处理的原理 跳转到异常向量:根据 异常向量表基地址(通常配置在 VBAR 寄存器中,例如 0xFFFF0000) + 数据中止异常的偏移量 0x10,跳转到数据中止异常的处理程序入口点 0xFFFF0010(实践中,这个入口通常是一条跳转到更复杂处理函数的指令)。malloc 通常不会立即分配物理内存页,它只是在内核为该进程维护的虚拟地址空间中找到一段足够大的空闲虚拟地址区域(比如 0x00008000 - 0x00008FFF),标记为已用,并返回起始地址(例如 0x00008000)给程序。 阅读详情

以前进行关于线程的操作,全部都是用Handler配合Thread来进行,比如下载文件等耗时较长的工作,都是开一个新的线程来做,慢慢的感觉有点麻烦了,因为在Thread中不能操作UI界面,如果我想改变一个View的内容,就必须借助Handler来实现,不太方便,所以,偶然的机会让我认识了AsyncTask,它用起来就很方便,虽然我还是不太懂它的实现原理,看了网上大神的博客,写的是它的源码,说的内容我不是太懂,这里我就不说了,我就讲一下它的基本用法。

AsyncTask 的基本用法

首先来看一下 AsyncTask 的基本用法,由于 AsyncTask 是一个抽象类,所以如果我们想使用它,就必须
要创建一个子类去继承它。 在继承时我们可以为 AsyncTask 类指定三个泛型参数, 这三个参数的用途如下:
1. Params
在执行 AsyncTask 时需要传入的参数,可用于在后台任务中使用。
2. Progress
后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型作为进度单位。
3. Result
当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型。

因此,一个最简单的自定义 AsyncTask 就可以写成如下方式:

 class DownloadTask extends AsyncTask<Void, Integer, Void{}
这里我们把 AsyncTask 的第一个泛型参数指定为 Void,表示在执行 AsyncTask 的时候不需要
传入参数给后台任务。第二个泛型参数指定为 Integer,表示使用整型数据来作为进度显示单
位。第三个泛型参数指定为 Void
经常需要去重写的方法有以下四个:
1. onPreExecute()
这个方法会在后台任务开始执行之前调用,用于进行一些界面上的初始化操作,比如显示一个进度条对话
框等。
2. doInBackground(Params...)
这个方法中的所有代码都会在子线程中运行,我们应该在这里去处理所有的耗时任务。任务一旦完成就可
以通过 return 语句来将任务的执行结果进行返回,如果 AsyncTask 的第三个泛型参数指定的是 Void,就
可以不返回任务执行结果。注意,在这个方法中是不可以进行 UI 操作的,如果需要更新 UI 元素,比如说
反馈当前任务的执行进度,可以调用 publishProgress(Progress...)方法来完成。
3. onProgressUpdate(Progress...)
当在后台任务中调用了 publishProgress(Progress...)方法后,这个方法就很快会被调用,方法中携带的参
数就是在后台任务中传递过来的。在这个方法中可以对 UI 进行操作,利用参数中的数值就可以对界面元素
进行相应的更新。
4. onPostExecute(Result)
当后台任务执行完毕并通过 return 语句进行返回时,这个方法就很快会被调用。

也就是说,我们需要覆盖其中的几个方法来实现我们自己的操作。

下面是我自己写的一个小例子,用AsyncTask来实现进度条,效果图如下:

下面是MainActivity的代码,代码很容易懂,看完之后就应该对AsyncTask的使用有了基本的认识了。

public class MainActivity extends Activity {

	TextView text;
	ProgressBar mBar;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		text = (TextView) findViewById(R.id.text);
		mBar = (ProgressBar) findViewById(R.id.proBar);
		ProgressbarTask task = new ProgressbarTask();
		task.execute();
		/*
		*开始执行,首先执行onPreExecute()方法
		*然后执行doInBackground(),在这个方法中调用publishProgress(i)来实现界面更新
		*/
	}
	class ProgressbarTask extends AsyncTask<Void,Integer, Void>{
		@Override
		protected void onPreExecute() {
			mBar.setMax(100);
			super.onPreExecute();
		}
		@Override
		protected Void doInBackground(Void... params) {
			for(int i=0;i<=100;i++){
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {}
				publishProgress(i);
			}
			return null;
		}
		@Override
		protected void onProgressUpdate(Integer... values) {
			mBar.setProgress(values[0]);
			text.setText(values[0]+"%");
			super.onProgressUpdate(values);
		}
		@Override
		protected void onPostExecute(Void result) {
			text.setText("完成");
			super.onPostExecute(result);
		}
	}
}

好了,看完代码大家应该对AsyncTask有了一定的了解啦,如果还有什么不懂的,欢迎大家和我交流。

下载源码


BraTS数据集保姆级使用指南:从下载、预处理到可视化(附Python脚本) 本文提供BraTS数据集的完整使用指南,涵盖从下载、预处理到可视化的全流程,并附有Python脚本示例。详细解析了医学影像处理中的数据结构、标准化流程和可视化技巧,帮助初学者快速掌握BraTS数据集的应用方法,提升医学影像分析效率。 阅读详情

相关推荐

【win11 cuda12.0安装tensorflow-gpu】

win11 cuda 12.0 安装 tensorflow-gpu

weixin_36299320的博客 3009

巧用AsyncTask的onProgressUpdate回调

AsyncTask简介AsyncTask相信大家已经特别熟悉了,它是Android提供的一个轻量级的异步处理类。它简单易用,可以很容易地执行后台任务,也可以很方便地将后台任务执行的进度与结果发送到UI线程。爱与恨由于Android的单线程模型,异步处理在Android开发中显得尤为重要,因此线程中的交互不可避免。假如我们利用Android消息机制自己实现这个过程,则较为复杂且有着发生各种各样错误的风

Battling against our own ignorance 6685

系统磁盘从MBR格式转换成GPT格式来升级win11

之前的《》中说到,需要把磁盘格式转化为MBR格式才能执行下去。问题是,win10升级win11要求启动方式为UEFI的话,磁盘格式不能为MBR。其实不升级也不影响啥,但是就是想好看点。所以花了点时间折腾了一下。我这是双系统,所以直接去A系统修复B系统的磁盘格式和引导。

qq_42520962的博客 9041

(进度条)AsyncTask中核心方法讲解之易被忽略的onProgressUpdate

AsyncTask是一种轻量级的异步任务类,可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程并在主线程中更新UI。      它是一个抽象的泛型类,它提供了Params、Progress、和Result着三个泛型参数,本篇主要讲解第二个参数的应用,进度条的实现。      说一下进度条实现相关两个方法:       doInBackground(Params...par

程序员成长指北 5216

RPA 财务共享中心与RPA赋能

在和集团财务官交流的时候,客户经常会提到FSSC,其中有准备建立FSSC,正在建立FSSC,以及已建成FSSC正使用的,当中会有些对FSSC的疑虑和问题,所以花费些时间对FSSC进行了深入调研,从而也有幸拜读了王兴山、陈剑、梅震、钱自严等专业人士写的几本关于FSSC的书,对FSSC的前因后果有了更深入的认识,同时结合自己在FSSC的一些项目经验,故做了本次分享。 本文章主要分享财务共享中心以及R...

weixin_40244959的博客 2756

esp32移植canopen协议栈(二)

本文续接上一篇文章,之前我们已经搭建好了esp32的开发环境,以及初始工程。接下来我们开始实现can驱动相关,以及使用c++封装can接口。本文使用esp32实现c++实现can驱动层的封装。下一步移植canopen!!!嘻嘻。

qq_50267418的博客 1906

关于微信小程序onProgressUpdate中progress为null的问题

关于微信小程序onProgressUpdate中progress为null的问题

weixin_47327288的博客 1400

西门子PLC与汇川SV660P伺服速度模式配置实战指南

本文详细介绍了西门子S7-1200 PLC与汇川SV660P伺服驱动器在速度模式下的配置实战指南。从硬件接线、伺服参数配置到TIA Portal软件组态和PLC程序编写,提供了全面的操作步骤和实用技巧,帮助工程师快速解决伺服系统调试中的常见问题,确保系统稳定运行。

weixin_30316097的博客 500

js 调用 UpdateProgress

UpdateProgress一般这样用起来比较容易一些.一般会这样用:html:                                                                        Text="Button" />                                                                  

小小猪的专栏 961

Openclaw错误排查及解决方案之:Previous run is still shutting down. Please try again in a moment.

Openclaw错误排查及解决方案之:Previous run is still shutting down. Please try again in a moment.

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 232

vscode的launch:program ‘‘ does not exist

如图 一般是由于launch.json文件没有配置好的缘故。在右下角的ADD configuration如选第二个登录: 看到program这一栏,这一栏很重要,一般是选择你CMakelist,编译出来的可执行文件 看我CMakelist, 我生成的可执行文件是test_,所以路径可以这样输入: 我在之前cmake的时候已经有了test_这个文件了 然后就可以运...

狂小虎/Anthony Dave的博客 KuangXiaoHu's Blogs 5万+

Uniapp上传

uni.chooseImage({ success: (chooseImageRes) => { const tempFilePaths = chooseImageRes.tempFilePaths; const uploadTask = uni.uploadFile({ url: 'https://www.example.com/upload', //仅为示例,非真实的接口地址 filePath: tempFil

m0_54009761的博客 276

【WorkBuddy专栏43】如何利用WorkBuddy开发一个PC网站(上)——环境选型、设计编码到部署上线

【WorkBuddy专栏43】如何利用WorkBuddy开发一个PC网站(上)——环境选型、设计编码到部署上线

AI人人懂 2254

AsyncTask的使用

写在前面 AsyncTask简介 AsyncTask异步任务,是Android提供给我们的一个处理异步任务的类. 通过该类,可以实现UI线程和后台线程间的通讯. 后台线程执行异步任务,并将结果及进度传递给UI线程,由UI线程做相应处理和显示. 为什么使用异步任务(子线程操作) Android中只有UI线程能进行更新UI的操作. 这样能保证UI的稳定性和准确性,避免多个线程同时对UI...

简单记录 1012

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android AsyncTask 深度解析

params)返回的结果,参数类型由AsyncTask类上的第三个泛型限定;onPreExecute()和onPostExecute()方法都执行在主线程,onProgressUpdate()能够更改UI(更改进度条进度)必然也是主线程。这个小demo通过求1-10的和,在doInBackground()方法中通过延时的方式模拟了耗时操作,简单的演示了AsyncTask的使用。doInBackground()方法执行在线程池某一线程中,(看过源码后得到的结果,通过Log可以知道该方法没有执行在主线程中)

2501_90389522的博客 1582

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

AsyncTask使用及解析

目录   1.AsyncTask介绍 1)AsyncTask抽象类的3参数 2)继承AsyncTask可以实现的函数 3)常用公共函数 2.AsyncTask使用  1)demo1:加载单张图片 2)demo2:异步加载多张图片 3)取消异步任务 3.注意点 1)AsyncTask不与任何组件绑定生命周期 2)内存泄漏 3)屏幕旋转 4)串行或者并行的执行异步任务 4...

qq_37321098的博客 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

AsyncTask 使用详解

一. AsyncTask 是什么 AsyncTask是Android提供的执行异步操作的类,它通过对Thread和Handler进行封装,可以让我们在后台线程中执行耗时操作,然后将结果发送给UI主线程,从而在主线程中进行UI更新等操作。 二. 为什么要引入 AsyncTask 其实在 Android 中我们经常通过 Thread + Handler实现多线程通信,Handler实现异步任...

Luckcat 644

android之AsyncTask

android之AsyncTask

qq_44910624的博客 291

使用AsyncTask

Android还提供了一外一些好用的工具,为了方便我们在子线程中对UI进行操作。AsyncTask就是其中之一。 借助AsyncTask可以十分简单地从子线程切换到主线程。AsyncTask背后的实现原理也是基于异步消息机制的。 AsyncTask的基本用法,由于AsyncTask是一个抽象类,在使用它,就必须要创建一个子类去继承它,在继承时我们可以为AsyncTask类指定三个泛型参数,这三

有所不同 526

AsyncTask

1.AsyncTask是封装好的线程池,比起Thread+Handler的方式,AsyncTask在操作UI线程上更方便,因为onPreExecute()、onPostExecute()及更新UI方法onProgressUpdate()均运行在主线程中,这样就不用Handler发消息处理了; 2.真正的缺点来自于AsyncTask的全局线程池只有5个工作线程,也就是说,一个APP如果运用A...

cao1991w的专栏 267

Android AsyncTask 源码解析

一个接着一个的执行,相当于单线程。22行:将我们传入的参数赋值给了mWorker.mParams ,mWorker为一个Callable的子类,且在内部的call()方法中,调用了doInBackground(mParams),然后得到的返回值作为postResult的参数进行执行;看到这里,大家可能会认为,背后原来有一个线程池,且最大支持128的线程并发,加上长度为10的阻塞队列,可能会觉得就是在快速调用138个以内的AsyncTask子类的execute方法不会出现问题,而大于138则会抛出异常。

2401_89790938的博客 991

使用Kotlin的Android AsyncTask

In this tutorial, we’ll learn and implement AsyncTask using Kotlin in our Android Application. 在本教程中,我们将在Android应用程序中使用Kotlin学习和实现AsyncTask。 什么是Android AsyncTask? (What is Android AsyncTask?) Androi...

从零开始的教程世界 2452

AsyncTask使用

AsyncTask异步执行耗时操作,更新UI线程。

贺祥的博客-清风依然 258

AsyncTask使用详解

AsyncTask定义和Handler作用相似,AsyncTask也是为了处理异步任务的。代码操作上AsyncTask比Handler轻量级,但是资源实现上Handler比AsyncTask轻量级。AsyncTask不需要Handler和新线程的介入即可完成异步任务与UI之间的更新操作。Handler不限定运行环境,而AsyncTask必须在主线程调用。AsyncTask实际上是一个线程池,最大只支

Z_DingHao的博客 836
上一篇: 初识JSON
下一篇: Eclipse配置自定义主题
潘建成
博客等级 码龄12年 139粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值