0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HarmonyOS实战:一招解决等待多个并发结果

尤枫 来源:jf_54996641 作者:jf_54996641 2025-06-09 14:57 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

年前公司与华为签订了合作备忘录,加入了鸿蒙生态这个大家庭。。公司想赶着鸿蒙纯血系统上市之前,发布自己的鸿蒙软件。开发鸿蒙NEXT版本软件就变成了今年的一个工作重心。

** 本文主要讲解开发过程中遇到的并发问题,官方API 11文档写的太简单了,根本没有解决方案,小编也是苦思冥想,绞尽脑汁才找到解决方案。需要开发鸿蒙的小伙伴可以仔细阅读,避免踩坑。**

问题

在开发清除缓存的功能时,鸿蒙NEXT提供的文档中说明,应用缓存文件有四个,需要清除指定的四个缓存文件夹。如图所示:

清除缓存代码如下:

import fs from '@ohos.file.fs'
          
    fs.access("文件路径").then((isHas:boolean) = > {
      if(isHas) { //判断文件是否存在
        fs.rmdirSync("文件路径")//删除文件
       
      }
    })

需要同时清除这四个文件夹,然后再计算这四个文件夹的大小。由于fs.access 方法是耗时操作。所以只能在异步线程中执行。

解决方案

一般思路

鸿蒙官方文档API 11 提供了使用Promise和async/await处理异步并发问题。

注意是单次I/O任务,可问题是我们需要解决同时并发问题,一次拿到四次清除缓存结果再去统计缓存大小。这个时候可能有的小伙伴就会说,那就先清除第一个,等一个结果返回再清除第二个,以此类推。也能解决问题。如下图所示:

fs.access("文件路径1").then((isHas:boolean) = > {
      if(isHas) { //判断文件是否存在
        fs.rmdirSync("文件路径1")//删除文件
               
       fs.access("文件路径2").then((isHas:boolean) = > {
         if(isHas) { //判断文件是否存在
           fs.rmdirSync("文件路径2")//删除文件
             .....................
        }
    })
      }
    })

但是这样就会带来两个问题:多层嵌套与代码混乱。在Flutter中这个问题非常好解决。这里就不详细描述了。

优雅方案

使用Promise.all 解决。小编在官方文档中并没有找到Promise.all 相关说明,可能是鸿蒙还没注意到这种需求场景吧。直接上代码。

  1. 先将文件清除包装成一个异步任务。
asyncClear(dir: string): Promise< void > {
    return new Promise((resolve, reject) = > {
      fs.access(dir).then((isHas: boolean) = > {
        if (isHas) {
          fs.rmdir(dir)
        }
        resolve()
      })
    })
  }
  1. 将四个缓存文件夹对应的任务放在一个数组中。
let promises = [
      this.asyncClear("文件夹1"),
      this.asyncClear("文件夹2"),
      this.asyncClear("文件夹3"),
      this.asyncClear("文件夹4")
    ]
  1. 将任务数组放进Promis.all中,等待四个任务执行结束。
Promise.all(promises).then(() = > {
      // 结束回调
    })
  1. 在结束回调中 再去调用计算缓存大小的方法。
storageStatistics.getCurrentBundleStats().then((bundleStats) = > {
        let cacheSizeNum = bundleStats.cacheSize
        let unit = "KB"
        if (cacheSizeNum > 1024) {
          cacheSizeNum = Math.floor(cacheSizeNum) / 1024
          unit = "KB"
        }
        if (cacheSizeNum > 1024) {
          cacheSizeNum = Math.floor(cacheSizeNum) / 1024
          unit = "MB"
        }
        if (cacheSizeNum > 1024) {
          cacheSizeNum = Math.floor(cacheSizeNum) / 1024
          unit = "GB"
        }
        if (cacheSizeNum > 1024) {
          cacheSizeNum = Math.floor(cacheSizeNum) / 1024
          unit = "TB"
        }
        let chacheSizeString = "" + Math.floor(cacheSizeNum) + unit
      });

总结

鸿蒙NEXT的API还不算完善,需要每个开发者的参与,发现问题,提出问题,鸿蒙开发人员才能更好的解决问题。如果您也是鸿蒙开发者,有其他更好的解决方案,欢迎评论区交流 ,互相学习,互相成长!

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鸿蒙
    +关注

    关注

    60

    文章

    3019

    浏览量

    46178
  • HarmonyOS
    +关注

    关注

    80

    文章

    2157

    浏览量

    36294
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Java并发编程的“基石”——多线程概念初识

    之下,隐藏着个庞大而复杂的“算力帝国”。如何将成千上万块 GPU 的算力精准、高效地分配给无数个并发的 AI 任务?这便是 AI 算力调度的核心使命。在这个看似属于 Python 和 C++ 的绝对
    发表于 04-16 18:50

    Nginx高并发连接调优实战手册

    Nginx 的高性能源自其事件驱动架构。与 Apache 的"每连接线程"模型不同,Nginx 使用单线程事件循环处理数千个并发连接。理解这套架构是调优的前提。
    的头像 发表于 03-16 15:28 430次阅读

    Go 语言高并发服务设计与性能调优实战:从万级到百万级并发的演进之路

    10W+ 连接 性能满意度 开发者满意度 89% 微服务采用率 云原生项目中占比 67% 本文将从 并发模型 、 性能优化 、 资源管理 、监控调优四个维度,分享套经过多个并发
    发表于 02-18 19:19

    如何在单个图表上绘制多个测量结果曲线

    用户常常希望对批设备进行测量,并将结果显示在同个图表上以便比较。APx序列(Sequence)的设计是每次仅显示个设备的结果。如果您的
    的头像 发表于 02-11 09:02 242次阅读
    如何在单个图表上绘制<b class='flag-5'>多个</b>测量<b class='flag-5'>结果</b>曲线

    文说透了如何实现单片机的多任务并发

    多任务并发、任务调度 任务调度是多任务并发个非常重要的概念。它指的是如何在系统中组织和规划多个任务的顺序和时间。任务调度的目的是使
    发表于 01-06 06:46

    智能楼宇改造避坑指南:别再换掉所有老设备!一招搞定ETHERNET/IP转DEVICENET的共存难题

    智能楼宇改造避坑指南:别再换掉所有老设备!一招搞定ETHERNET/IP转DEVICENET的共存难题 1. 项目背景:老旧楼宇的智能化挑战 在现代智能楼宇控制系统中,我们常面临新旧设备混合的复杂
    的头像 发表于 12-17 15:35 336次阅读
    智能楼宇改造避坑指南:别再换掉所有老设备!<b class='flag-5'>一招</b>搞定ETHERNET/IP转DEVICENET的共存难题

    Swift 的并发系统并行运行多个任务

    ​​前言 Swift 内置并发系统的好处之是它可以更轻松地并行执行多个异步任务,这反过来又可以使我们显着加快可以分解为单独部分的操作。 在本文中,让我们看下几种不同的方法,以及这些
    的头像 发表于 11-11 11:33 564次阅读

    别再卡分页!淘宝全量商品接口实战开发指南:从并发优化到数据完整性闭环

    淘宝店铺全量商品接口实战指南:详解权限申请、分页优化、并发拉取与增量更新,结合代码实现高效稳定的数据获取,解决超时、限流、数据丢失等核心难题,助力电商数据分析避坑提效。
    的头像 发表于 09-30 10:47 706次阅读

    AppGallery Connect(HarmonyOS 5及以上) --公开测试创建并发布测试版本(三)

    。手机号码用于华为审核人员与您沟通审核问题,邮箱用于接收上架审核结果,应用整改或下架通知。 19.配置测试发布。 20.点击页面右上角“提交”,将测试版本提交审核。提交成功后,可在“版本列表”页面查看版本
    发表于 09-29 17:38

    AppGallery Connect(HarmonyOS 5及以上) --公开测试创建并发布测试版本(

    )的公开测试版本会自动下架。 发布测试版本 首先,您需创建并发布测试版本。最多支持1个公开测试版本在架, 1.登录AppGallery Connect,选择“APP” 2.在应用列表页
    发表于 09-26 17:24

    创建并发布测试版本(

    配置软件版本。 5.配置测试信息。 测试信息默认继承全网版本信息或最近个测试版本填写的信息。如需调整,请在当前测试版本提交前重新审视并修改,测试信息配置不影响全网版本的应用信息。 本文主要从参考引用自HarmonyOS官方文档
    发表于 09-16 15:21

    工业电路总出问题?槟城BMG10D系列压敏复合器件:一招解决过压难题

    ”。工业电路总出问题?槟城BMG10D系列压敏复合器件:一招解决过压难题。它从根源上保证了品质——原厂技术支持、稳定供货,不用担心中间环节出岔子,买得放心,用得也踏
    的头像 发表于 09-05 16:58 693次阅读
    工业电路总出问题?槟城BMG10D系列压敏复合器件:<b class='flag-5'>一招</b>解决过压难题

    HarmonyOS实战一招搞定保存图片到相册

    保存图片功能几乎是每个应用程序必备的功能之,当用户遇到喜欢的图片时可以保存到手机相册。那么在鸿蒙中保存图片是否也需要申请用户存储权限以及如何将图片保存到相册,本文将详细讲述怎么保存网络图片,指定布局生成图片保存至相册的功能实现。
    的头像 发表于 06-24 17:04 1423次阅读

    鸿蒙5开发宝藏案例分享---应用并发设计

    ?** 鸿蒙并发编程实战指南:解锁ArkTS多线程黑科技** 嘿,开发者朋友们! 今天给大家扒扒鸿蒙官方文档里藏着的并发编程宝藏—— 100+实战
    发表于 06-12 16:19

    HarmonyOS实战:组件化项目搭建

    ?本文将详细讲解HarmonyOs组件化项目搭建的全过程,带领大家实现个组件化项目。 项目创建 首先创建个项目工程,点击开发工具DevEco-Stdio的****File 选项,选择 New 然后点击 Create Proj
    的头像 发表于 06-09 14:58 794次阅读
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>实战</b>:组件化项目搭建