【HarmonyOS】TaskPool非阻塞UI
TaskPool方法不会阻塞UI,如果做上传图片的功能加载Loading记得使用TaskPool,Promise、Async/Await都会阻塞UI

【引言】
发现Promise可能会阻塞UI,尝试使用async或await,但发现它们仍然会导致阻塞。后来看到chaoxiaoshu回复的TaskPool方法,发现使用该方法后UI不再阻塞。因此,我特意编写了一个加载弹窗进行测试,结果同样显示,只有TaskPool方法不会阻塞UI。
【代码示例】
import { taskpool } from '@kit.ArkTS';@Component
export struct MyDialog_1 {@Prop dialogID: string@State title: string = '加载中...'build() {Stack() {Column() {LoadingProgress().color(Color.White).width(100).height(100)Text(this.title).fontSize(18).fontColor(0xffffff).margin({ top: 8 }).visibility(this.title ? Visibility.Visible : Visibility.None)}}.onClick(() => {getContext(this).eventHub.emit(this.dialogID, "关闭弹窗")}).width(180).height(180).backgroundColor(0x88000000).borderRadius(10).shadow({radius: 10,color: Color.Gray,offsetX: 3,offsetY: 3})}
}@Entry
@Component
struct Page28 {@State time3: string = ""@State isShowLoading: boolean = falsebuild() {Stack() {Column({ space: 20 }) {Button("【方案一】测试Promise").type(ButtonType.Capsule).onClick(() => {this.isShowLoading = truethis.time3 = 'loading...'console.log("start call promise")testPromise(100000000).then((time) => {this.time3 = `耗时:${time}`console.log("promise then")this.isShowLoading = false})console.log("end call promise")})Button("【方案二】测试async await").type(ButtonType.Capsule).onClick(() => {this.isShowLoading = truethis.time3 = 'loading...'console.log("start call promise")this.testPromise()console.log("end call promise")})Button("【方案三】测试taskpool").type(ButtonType.Capsule).onClick(() => {this.isShowLoading = truethis.time3 = 'loading...'let task: taskpool.Task = new taskpool.Task(concurrentFunc, 100000000);taskpool.execute(task);task.onReceiveData((time: number) => {this.time3 = `耗时:${time}`;console.log("====end")this.isShowLoading = false})})Text(this.time3)}.alignItems(HorizontalAlign.Start)MyDialog_1().visibility(this.isShowLoading ? Visibility.Visible : Visibility.None)}.width('100%').height('100%')}//耗时操作async testPromise() {let time = await testPromise(100000000)time = new Date().getTime() - timethis.time3 = `耗时:${time}毫秒`console.log("promise then")this.isShowLoading = false}
}function testPromise(count: number): Promise<number> {return new Promise<number>((resolve) => {let time = Date.now().valueOf()let num = 0for (let i = 0; i < count; i++) {+num}time = Date.now().valueOf() - timeresolve(time)})
}@Concurrent
function concurrentFunc(count: number): void {let time = Date.now().valueOf()let num = 0for (let i = 0; i < count; i++) {+num}time = Date.now().valueOf() - timetaskpool.Task.sendData(time);
}
【方案一:Promise】
优点:
易于理解:Promise的语法简单,易于理解和使用。
链式调用:可以通过.then进行链式调用,处理多个异步操作。
缺点:
阻塞UI:在执行耗时任务时,Promise会阻塞UI线程,导致Loading弹窗不能及时显示。
【方案二:Async/Await】
优点:
同步写法:Async/Await 使异步代码看起来像同步代码,更加直观。
错误处理:可以使用try/catch块处理错误,使代码更加清晰。
缺点:
阻塞UI:与Promise类似,Async/Await在执行耗时任务时仍会阻塞UI线程,导致Loading弹窗不能及时显示。
【方案三:TaskPool】
优点:
真正的异步:TaskPool可以将耗时任务放到独立的线程中执行,不会阻塞UI线程,保证了UI的流畅性。
数据通信:通过task.onReceiveData可以方便地接收任务结果。
缺点:
复杂度增加:引入了多线程处理,增加了代码的复杂度和维护成本。
【使用注意事项】
任务复杂度:
如果任务较为简单且不会长时间阻塞UI,可以考虑使用Promise或Async/Await。
如果任务较为复杂且耗时较长,建议使用TaskPool以保证UI的流畅性(例如,上传图片时显示加载中)。
代码可读性:
Promise和Async/Await的语法较为简单,适合初学者使用。
TaskPool需要对多线程有一定了解,适合有经验的开发者。
性能考虑:
TaskPool在处理大量或耗时任务时表现更优,可以显著提升应用性能。
Promise和Async/Await在小任务场景下更简洁高效。
【总结】
选择合适的异步操作方案至关重要。Promise和Async/Await适合处理简单的异步任务,而TaskPool则在处理复杂耗时任务时表现出色。根据实际需求,选择最适合的方案,能有效提升开发效率和用户体验。希望本文对您在异步操作的选择和使用上有所帮助。
相关文章:
【HarmonyOS】TaskPool非阻塞UI
TaskPool方法不会阻塞UI,如果做上传图片的功能加载Loading记得使用TaskPool,Promise、Async/Await都会阻塞UI 【引言】 发现Promise可能会阻塞UI,尝试使用async或await,但发现它们仍然会导致阻塞。后来看到chaoxiaoshu回复的Tas…...
关于使用/bin/sh -c 用于Dockerfile的Entrypoint的问题
问题描述 相同的dockerfile,使用不同的基础镜像制作镜像1号进程不相同 ENTRYPOINT都是: /bin/sh -c pre-start.sh && myblockserver 的形式 就是执行多个命令命令,最后的一个命令是阻塞的 镜像1: 1号进程是 /bin/sh -c pre-start…...
JS---获取浏览器可视窗口的尺寸
innerHeight 和 innerWidth 这两个方法分别是用来获取浏览器窗口的宽度和高度(包含滚动条的) <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible&q…...
对抗攻击方法详解:梯度攻击、转移攻击与模型集成攻击
对抗攻击方法详解:梯度攻击、转移攻击与模型集成攻击 近年来,随着深度学习模型在各个领域取得惊人突破,对抗攻击(Adversarial Attack) 逐渐成为研究热点。对抗攻击旨在通过在输入数据上施加精心设计的微小扰动&#x…...
GPU并行效率问题——通过MPS提升GPU计算收益
GPU并行效率问题——通过MPS提升GPU计算收益_gpu mps-CSDN博客...
patch 命令:补丁的应用
一、命令简介 diff 和 patch 是传统的文件比较和应用差异的工具,而 git 是一个更现代、功能更全面的版本控制系统,它内置了 diff 和 patch 的功能,并且提供了更多用于代码管理和协作的高级特性。 diff, patch 和 git 之间的关系…...
仓颉编程语言4,遇到BUG求助
本来准备整仓颉链接Mysql数据库。参考:GitCode - 全球开发者的开源社区,开源代码托管平台 这种方式是拿mysql官方的dll,编译一下,然后再封装成仓颉数据库驱动。这种方式不够逼格,所以准备解析mysql网络协议,从0开始写…...
SpringIOCDI
1.IOC 1.1.IOC概述 IOC: Inversion Of Control,简称IOC,也被称为控制反转。对象的创建权由程序员主动创建转移到容器,由容器创建、管理对象,这种思想称为控制反转。这个容器称为IOC容器或Spring容器被IOC容器创建、管…...
单细胞Seruat和h5ad数据格式互换(R与python)方法学习和整理
SeruatV4数据转化为h5ad格式数据 1、导入(R) rm(list ls()) library(Seurat) library(qs) library(reticulate) library(hdf5r) library(sceasy) library(BiocParallel) register(MulticoreParam(workers 4, progressbar TRUE)) scRNA <- qread("sc_dataset.qs&q…...
分布式难题-三座大山NPC
文章目录 1. 三座大山 NPC 的概念2. NPC 细分理解2.1. Network Delay 网络延迟2.2. Process Pause 进程暂停2.3. Clock Drift 时钟漂移Is the Algorithm Asynchronous? 本文参考: RedLock红锁安全性争论(上) https://martin.kleppmann.com/…...
两个方法教你设置Excel密码,防止修改和复制Excel表格内容
EXCEL是一款功能强大的电子表格软件,广泛用于各个地方。然而,对于一些重要的表格文件需要通过设置密码来限制大就的修改和复制权限。因而,对于一个EXCEL表格,通过密码设置大家有访问表格的权限,但无法修改数据的权限。…...
Java解析Excel文件
目录 背景 技术选型 开源Java框架选型 1. Apache POI 2. EasyExcel 收费Java框架选型 1. Spire.XLS for java 2. Aspose 总结 背景 在低代码产品的研发过程中,为用户提供数据导入导出的能力时,无法避免的就是对EXCEL解析的能力,所以本篇通过介…...
Require:基于雪花算法完成一个局部随机,全局离散没有热点切唯一的数值Id生成器。
【雪花算法】雪花算法(Snowflake Algorithm)是Twitter开源的用于生成唯一ID的算法,它可以在分布式系统中生成唯一的64位长整数ID。这种ID生成方式既保证了趋势递增,又保证了在不同数据中心、不同机器上生成的ID的唯一性。 符号位&…...
libevent - Macro function
TAILQ_INIT /** Tail queue functions.* 尾队列的头结点初始化为空队列。*/ #define TAILQ_INIT(head) do { \(head)->tqh_first NULL; \(head)->tqh_last &(head)->tqh_first; \ } while (/*CONSTCOND*/0)TAILQ_INIT 宏是一个用于初始化尾队列头部…...
408算法题leetcode--第17天
101. 对称二叉树 101. 对称二叉树思路:递归,对称即两个子树的左边和右边分别一样;一个子树是左中右遍历,另一个是右中左遍历;写的时候可以分三步,确定函数参数以及返回类型,确定终止条件&#…...
机器人顶刊IEEE T-RO发布无人机动态环境高效表征成果:基于粒子的动态环境连续占有地图
摘要:本研究有效提高了动态环境中障碍物建模的精度和效率。NOKOV度量动作捕捉系统助力评估动态占用地图在速度估计方面的性能。 近日,上海交通大学、荷兰代尔夫特理工研究团队在机器人顶刊IEEE T-RO上发表题为Continuous Occupancy Mapping in Dynamic …...
spring-boot web + vue
依赖的软件 maven 1. 官网下载zip 文件,比如apache-maven-3.9.9-bin.zip 2. 解压到某个盘符,必须保证父亲目录的名字包含英文,数字,破折号(-) 3. 设置环境变量M2_HOME, 并将%M2_HOME%\bin添加到windown…...
HDFS分布式文件系统01-HDFS架构与SHELL操作
HDFS分布式文件系统 学习目标第一课时知识点1-文件系统的分类单机文件系统网络文件系统分布式文件系统 知识点2-HDFS架构知识点3-HDFS的特点知识点4-HDFS的文件读写流程知识点5-HDFS的健壮性 第二课时知识点1-HDFS的Shell介绍HDFS Shell的语法格式如下。HDFS Shell客户端命令中…...
Go语言流程控制
Go语言流程控制 1.IF-ELSE2.Switch-Caseswitch 语句Type Switch 3.select 语句4.循环语句 1.IF-ELSE Go 编程语言中 if 语句的语法如下: if 布尔表达式 {/* 在布尔表达式为 true 时执行 */ }例如: package mainimport "fmt"func main() {va…...
无人机在救灾方面的应用!
一、灾害监测与评估 实时监测与评估:无人机可以快速到达灾害现场,通过搭载的高清摄像头、红外热成像仪等设备,对灾区进行实时监测和灾情评估。根据捕捉到的受灾范围、火势大小、建筑物损坏情况等关键信息,为救援行动提供决策依据…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...
