鸿蒙(API 12 Beta2版)NDK开发【使用Node-API接口进行异步任务开发】

使用Node-API接口进行异步任务开发

场景介绍

napi_create_async_work是Node-API接口之一,用于创建一个异步工作对象。可以在需要执行耗时操作的场景中使用,以避免阻塞主线程,确保应用程序的性能和响应性能。例如以下场景:

  • 文件操作:读取大型文件或执行复杂的文件操作时,可以使用异步工作对象来避免阻塞主线程。
  • 网络请求:当需要进行网络请求并等待响应时,使用异步工作对象可以确保主线程不被阻塞,从而提高应用程序的响应性能。
  • 数据库操作:当需要执行复杂的数据库查询或写入操作时,使用异步工作对象可以确保主线程不被阻塞,从而提高应用程序的并发性能。
  • 图像处理:当需要对大型图像进行处理或执行复杂的图像算法时,使用异步工作对象可以确保主线程不被阻塞,从而提高应用程序的实时性能。

异步调用支持callback方式和Promise方式,使用哪种方式由应用开发者决定,通过是否传递callback函数进行区分。

0

使用Promise方式示例

1

  1. 使用napi_create_async_work创建异步任务,并使用napi_queue_async_work将异步任务加入队列,等待执行。
struct CallbackData {napi_async_work asyncWork = nullptr;napi_deferred deferred = nullptr;napi_ref callback = nullptr;double args = 0;double result = 0;
};static napi_value AsyncWork(napi_env env, napi_callback_info info)
{size_t argc = 1;napi_value args[1];napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);napi_value promise = nullptr;napi_deferred deferred = nullptr;napi_create_promise(env, &deferred, &promise);auto callbackData = new CallbackData();callbackData->deferred = deferred;napi_get_value_double(env, args[0], &callbackData->args);napi_value resourceName = nullptr;napi_create_string_utf8(env, "AsyncCallback", NAPI_AUTO_LENGTH, &resourceName);// 创建异步任务napi_create_async_work(env, nullptr, resourceName, ExecuteCB, CompleteCB, callbackData, &callbackData->asyncWork);// 将异步任务加入队列napi_queue_async_work(env, callbackData->asyncWork);return promise;
}
  1. 定义异步任务的第一个回调函数,该函数在工作线程中执行,处理具体的业务逻辑。
static void ExecuteCB(napi_env env, void *data)
{CallbackData *callbackData = reinterpret_cast<CallbackData *>(data);callbackData->result = callbackData->args;
}
  1. 定义异步任务的第二个回调函数,该函数在主线程执行,将结果传递给ArkTS侧。
static void CompleteCB(napi_env env, napi_status status, void *data)
{CallbackData *callbackData = reinterpret_cast<CallbackData *>(data);napi_value result = nullptr;napi_create_double(env, callbackData->result, &result);if (callbackData->result > 0) {napi_resolve_deferred(env, callbackData->deferred, result);} else {napi_reject_deferred(env, callbackData->deferred, result);}napi_delete_async_work(env, callbackData->asyncWork);delete callbackData;
}
  1. 模块初始化以及ArkTS侧调用接口。
// 模块初始化
static napi_value Init(napi_env env, napi_value exports)
{napi_property_descriptor desc[] = {{ "asyncWork", nullptr, AsyncWork, nullptr, nullptr, nullptr, napi_default, nullptr }};napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);return exports;
}// ArkTS侧调用接口
nativeModule.asyncWork(1024).then((result) => {hilog.info(0x0000, 'XXX', 'result is %{public}d', result);}
);

使用callback方式示例

2

  1. 使用napi_create_async_work创建异步任务,并使用napi_queue_async_work将异步任务加入队列,等待执行。
struct CallbackData {napi_async_work asyncWork = nullptr;napi_ref callbackRef = nullptr;double args[2] = {0};double result = 0;
};napi_value AsyncWork(napi_env env, napi_callback_info info) 
{size_t argc = 3;napi_value args[3];napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);auto asyncContext = new CallbackData();// 将接收到的参数保存到callbackDatanapi_get_value_double(env, args[0], &asyncContext->args[0]);napi_get_value_double(env, args[1], &asyncContext->args[1]);// 将传入的callback转换为napi_ref延长其生命周期,防止被GC掉napi_create_reference(env, args[2], 1, &asyncContext->callbackRef);napi_value resourceName = nullptr;napi_create_string_utf8(env, "asyncWorkCallback", NAPI_AUTO_LENGTH, &resourceName);// 创建异步任务napi_create_async_work(env, nullptr, resourceName, ExecuteCB, CompleteCB, asyncContext, &asyncContext->asyncWork); // 将异步任务加入队列napi_queue_async_work(env, asyncContext->asyncWork);return nullptr;
}
  1. 定义异步任务的第一个回调函数,该函数在工作线程中执行,处理具体的业务逻辑。
static void ExecuteCB(napi_env env, void *data) 
{CallbackData *callbackData = reinterpret_cast<CallbackData *>(data);callbackData->result = callbackData->args[0] + callbackData->args[1];
}
  1. 定义异步任务的第二个回调函数,该函数在主线程执行,将结果传递给ArkTS侧。
static void CompleteCB(napi_env env, napi_status status, void *data) 
{CallbackData *callbackData = reinterpret_cast<CallbackData *>(data);napi_value callbackArg[1] = {nullptr};napi_create_double(env, callbackData->result, &callbackArg[0]);napi_value callback = nullptr;napi_get_reference_value(env, callbackData->callbackRef, &callback);// 执行回调函数napi_value result;napi_value undefined;napi_get_undefined(env, &undefined);napi_call_function(env, undefined, callback, 1, callbackArg, &result);// 删除napi_ref对象以及异步任务napi_delete_reference(env, callbackData->callbackRef);napi_delete_async_work(env, callbackData->asyncWork);delete callbackData;
}
  1. 模块初始化以及ArkTS侧调用接口。
// 模块初始化
static napi_value Init(napi_env env, napi_value exports)
{napi_property_descriptor desc[] = {{ "asyncWork", nullptr, AsyncWork, nullptr, nullptr, nullptr, napi_default, nullptr }};napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);return exports;
}// ArkTS侧调用接口
let num1: number = 123;
let num2: number = 456;
nativeModule.asyncWork(num1, num2, (result) => {hilog.info(0x0000, 'XXX', 'result is %{public}d', result);
}); 

最后呢

很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

在这里插入图片描述

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细鸿蒙(OpenHarmony )手册(共计1236页)与鸿蒙(OpenHarmony )开发入门视频,帮助大家在技术的道路上更进一步。

  • 《鸿蒙 (OpenHarmony)开发学习视频》
  • 《鸿蒙生态应用开发V2.0白皮书》
  • 《鸿蒙 (OpenHarmony)开发基础到实战手册》
  • OpenHarmony北向、南向开发环境搭建
  • 《鸿蒙开发基础》
  • 《鸿蒙开发进阶》
  • 《鸿蒙开发实战》

在这里插入图片描述

总结

鸿蒙—作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发。

并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用。那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才。鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行! 自↓↓↓拿

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3281376.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

入门 PyQt6 看过来(案例)17~ 表格

PyQt6提供了两种用于有规律地呈现更多数据的控件&#xff0c;一种是表格结构的控件(QTableView)&#xff0c;另一种是树形结构的控件(QTreeView)。表格控件属于QTableView类&#xff0c;QTableWidget继承于QTableView。 1 QTableView 表格控件 QTableView控件中QStandItemMod…

IT人求职就业手册:如何在数字时代脱颖而出

&#x1f482; 个人网站:【 摸鱼游戏】【网址导航】【神级代码资源网站】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…

【CodinGame】趣味算法(教学用) CLASH OF CODE -20240731

文章目录 正文闰年偶数和密码塔楼高度 写在最后END 正文 闰年 import sys import math# Auto-generated code below aims at helping you parse # the standard input according to the problem statement.a int(input()) b int(input()) count0 for i in range(a, b 1):if…

DELL服务器RAID配置详细教程

DELL服务器RAID配置教程 在启动电脑的时候按CTRLR 进入 RAID 设置见面如下图 名称解释&#xff1a; Disk Group&#xff1a;磁盘组&#xff0c;这里相当于是阵列&#xff0c;例如配置了一个RAID5&#xff0c;就是一个磁盘组 VD(Virtual Disk)&#xff1a; 虚拟磁盘&#xff…

开启智能开发的新纪元:探索 GPT-4o mini 模型的无限可能

引言 随着人工智能技术的飞速发展&#xff0c;大型语言模型已成为推动软件开发和创新的关键力量。OpenAI 最新发布的 GPT-4o mini 模型以其卓越的性能和极具竞争力的价格&#xff0c;为开发者社区带来了新的活力。本文将探讨 GPT-4o mini 模型的特性&#xff0c;以及它如何帮助…

K8S第二节:kubeadm搭建K8s集群

上回书说到什么是K8s&#xff0c;这回就在我自己的虚拟机上搭建一个K8s集群; 一、安装K8S需要的软件包 yum install -y kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1 其中&#xff1a; kubelet:是K8s集群中每个node节点上的管家&#xff0c;用来处理Master节点下发到本节点的…

深入源码:解析SpotBugs (5)BugReportor

常见的 Bug 定位后&#xff0c;通过 bugReport的reportBug&#xff08;BugInstance&#xff09; 方法&#xff0c;将bug 发布出来。 一般的 Detector 经检测后会调用 bugReportor.reportBug 方法或者 BugAccumulator.accumulateBug 。 在GUI中&#xff0c;分析结束后会在下框…

楼宇智能化仿真实训室解决方案

在信息技术的浪潮中&#xff0c;智慧城市作为未来城市发展的新形态&#xff0c;正以前所未有的速度在全球范围内兴起。其中&#xff0c;楼宇智能化作为智慧城市的关键构成&#xff0c;扮演着举足轻重的角色。它不仅提升了建筑的能源效率、安全性与舒适度&#xff0c;还促进了城…

WIFI7:引领智能驾驶新未来

近年来&#xff0c;智能驾驶技术飞速发展&#xff0c;从最初的初级的辅助驾驶逐步迈向高度自动驾驶&#xff0c;这一变化历程深刻依赖的是高效、稳定且前沿的无线通信技术的支撑。WIFI7&#xff0c;作为无线通信领域的最新里程碑&#xff0c;凭借其前所未有的性能提升与功能拓展…

这些才是电脑该装的,5款软件良心且实用,别让它们寒心

为什么别人的电脑&#xff0c;开机无广告&#xff0c;使用0卡顿&#xff0c;下载资源快的飞起&#xff0c;网页就是简洁画面。 而自己的电脑却.....开机超过1%&#xff0c;广告一大堆&#xff0c;下载速度差之千里&#xff0c;网页全是“是兄弟&#xff0c;就来砍我”的船新版…

奥运会被误报的韩国国旗,有多少AI能准确识别?结果出人意料!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

飞创直线模组桁架机械手优势及应用领域

随着工业自动化和智能制造的发展&#xff0c;直线模组桁架机械手极大地减轻了人类的体力劳动负担&#xff0c;在危险性、重复性高的作业环境中展现出了非凡的替代能力&#xff0c;引领着工业生产向自动化、智能化方向迈进。 一、飞创直线模组桁架机械手优势 飞创直线模组桁架…

Spring Boot集成udp通讯

Spring Boot集成udp通讯 加入依赖编辑配置文件配置相关属性具体业务类客户端调试 加入依赖 <!--加入UDP通信所需依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-integration</artifactId&…

【PCB设计原则5】-PCB设计的寄生元件

寄生电容 在PCB上布两条靠近的走线&#xff0c;很容易形成寄生电容。由于这种电容的存在&#xff0c;在一条走线上的快速电压变化&#xff0c;可在另一条走线上产生电流信号。 设计电路板时&#xff0c;放置两条彼此靠近的走线就会产生寄生电容。例如,在不同的两层&#xff0c…

OJ-0731

题目 题解 参考 import java.util.Arrays; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);while (scanner.hasNext()) {int xmh scanner.nextInt();int n scanner.nextInt();int[] COs …

SFP, SFP+,QSFP光模块封装类型

前言&#xff1a; 本文是自己对SFP, SFP,QSFP光模块封装类型的学习记录&#xff0c;所有的资料都搜集字引用链接里的博客内容&#xff0c;本文更多的是自己的学习笔记记录所以可能会有一些理解错误&#xff0c;请更多的参考引用链接里的信息来源。 引用&#xff1a; 认识SFP/SF…

Arduino Mega 2560开发板的引脚分配图及说明,以及链接can的方法

与Arduino Uno相比,Arduino Mega2560的资源就丰富多了,它具有54个数字I/O口(其中14个可提供PWM输出),16个模拟I/O口,4对串行数据通信口(UART),一个复位开关,一个ICSP下载口,支持USB接口和直流电源供电,具体的资源分配见下图。 Arduino Mega 2560开发板的引脚分配…

nginx代理设置时能获取到源IP地址的方法

nginx通过http_x_forwarded_for限制来访IP示例_ngnix 根据header的x-forwarded-for限制接入-CSDN博客 名称ip客户端地址10.0.23.90nginx服务器地址110.0.202.48:18888&#xff0c;代理到10.0.204.82:8888nginx服务器地址210.0.204.82:8888&#xff0c;代理到10.0.204.82:8887后…

Yarn UI 时间问题,相差8小时

位置 $HADOOP_HOME/share/hadoop/yarn/hadoop-yarn-common-2.6.1.jar 查看 jar tf hadoop-yarn-common-2.6.1.jar |grep yarn.dt.plugins.js webapps/static/yarn.dt.plugins.js 解压 jar -xvf hadoop-yarn-common-2.6.1.jar webapps/static/yarn.dt.plugins.js inflated: we…

Windows本地构建镜像推送远程仓库

下载 Docker Desktop https://smartidedl.blob.core.chinacloudapi.cn/docker/20210926/Docker-win.exe 使用本地docker构建镜像和推送至远程仓库&#xff08;harbor&#xff09; 1、开启docker的2375端口 2、配置远程仓库push镜像可以通过http harbor.soujer.com:5000ps&am…