鸿蒙HarmonyOS异步并发开发指南

✍️作者简介:小北编程(专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向)
🐳博客主页: 开源中国稀土掘金51cto博客博客园知乎简书慕课网CSDN
🔔如果文章对您有一定的帮助请👉关注✨、点赞👍、收藏📂、评论💬。
🔥如需转载请参考【转载须知】

一、并发概述

在应用开发中,并发是指在同一时间段内处理多个任务的能力。为了提升应用的响应速度与帧率,以及避免耗时任务阻塞主线程,HarmonyOS 提供了两种并发处理策略:

  • 异步并发:异步代码执行时会在特定时刻被挂起,之后在合适的时间点继续执行,同一时间只有一段代码在运行。这种方式适合处理单次 I/O 任务,如网络请求、文件读写等操作。
  • 多线程并发:允许在同一时间段内同时执行多段代码。在主线程继续响应用户操作并更新 UI 的同时,后台可以处理耗时任务,避免应用卡顿。

在 HarmonyOS 中,异步并发和多线程并发的应用场景广泛,开发者可以根据任务的需求选择合适的并发策略:

  • Promiseasync/await 提供异步并发能力,适用于单次 I/O 任务。
  • TaskPoolWorker 提供多线程并发能力,适用于 CPU 密集型任务、I/O 密集型任务等复杂并发场景。

二、异步并发概述

在 HarmonyOS 中,异步并发主要通过 Promiseasync/await 实现。这两种方法是 JavaScript 中标准的异步处理方式,可以有效避免阻塞主线程。

1.1 Promise

Promise 是一种异步操作的对象,它提供了一个机制来处理异步任务的不同状态,主要有三种状态:

  • pending(进行中)
  • fulfilled(已完成)
  • rejected(已拒绝)

Promise 的用法非常直观,通过实例化一个 Promise 对象并传入一个函数,该函数接收两个参数 resolvereject,用于标识异步操作成功或失败。

示例:

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    const randomNumber = Math.random();
    if (randomNumber > 0.5) {
      resolve(randomNumber);
    } else {
      reject(new Error('Random number is too small'));
    }
  }, 1000);
});

promise.then(result => {
  console.info(`Random number is ${result}`);
}).catch(error => {
  console.error(error.message);
});

上述代码通过 setTimeout 模拟异步操作,在 1 秒后生成随机数并决定执行成功或失败的回调。then 方法处理成功的结果,catch 方法捕获错误。

1.2 async/await

async/awaitPromise 的语法糖,使得异步代码看起来更像同步代码,简化了异步代码的编写和阅读。

示例:

async function myAsyncFunction() {
  const result = await new Promise((resolve) => {
    setTimeout(() => {
      resolve('Hello, world!');
    }, 3000);
  });
  console.info(result); // 输出: Hello, world!
}

myAsyncFunction();

在该例子中,await 等待 Promise 解析并返回结果,整个操作看起来像是同步执行,但实际是在异步操作完成后返回结果。

async/await 还可以配合 try/catch 捕获异步操作中的异常:

async function myAsyncFunction() {
  try {
    const result = await new Promise((resolve) => {
      resolve('Hello, world!');
    });
    console.info(result);
  } catch (e) {
    console.error(`Get exception: ${e}`);
  }
}

myAsyncFunction();

三、单次 I/O 任务开发

在 HarmonyOS 中,单次 I/O 任务的常见场景包括文件读写和网络请求。以下是使用异步能力进行单次文件写入操作的开发步骤。

3.1 实现单次 I/O 任务逻辑

首先,需要引入 HarmonyOS 文件系统模块并编写异步文件写入操作。

示例:

import fs from '@ohos.file.fs';

async function write(data: string, filePath: string) {
  try {
    const file = await fs.open(filePath, fs.OpenMode.READ_WRITE);
    await fs.write(file.fd, data);
    await fs.close(file);
    console.info('Succeeded in writing data.');
  } catch (err) {
    console.error(`Failed to write data. Code: ${err.code}, message: ${err.message}`);
  }
}

在这个例子中,fs.openfs.writefs.close 都是异步操作,通过 await 保证它们按顺序执行。如果任何操作失败,catch 会捕获异常并输出错误信息。

3.2 调用异步文件写入任务

开发者可以通过异步函数进行文件写入操作。以下是具体调用方式:

let filePath = 'path/to/your/file'; // 获取文件路径
write('Hello World!', filePath);

在执行时,write 函数会异步地将数据写入指定文件路径,并在成功后输出 “Succeeded in writing data.”,失败则会输出错误信息。


总结

在 HarmonyOS 中,异步并发是提升应用性能、避免主线程阻塞的重要手段。通过 Promiseasync/await,开发者可以轻松编写简洁的异步代码,适用于各种 I/O 密集型任务。

👍 点赞,是我创作的动力!
⭐️ 收藏,是我努力的指引!
✏️ 评论,是我进步的宝藏!
💖 衷心感谢你的阅读以及支持!

请添加图片描述

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小北编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值