鸿蒙HarmonyOS应用开发之使用Node-API接口进行异步任务开发
场景介绍napi_create_async_work是Node-API接口之一,用于创建一个异步工作对象。可以在需要执行耗时操作的场景中使用,以避免阻塞主线程,确保应用程序的性能和响应性能。例如以下场景:
[*] 文件操作:读取大型文件或执行复杂的文件操作时,可以使用异步工作对象来避免阻塞主线程。
[*] 网络请求:当需要进行网络请求并等待响应时,使用异步工作对象可以确保主线程不被阻塞,从而提高应用程序的响应性能。
[*] 数据库操作:当需要执行复杂的数据库查询或写入操作时,使用异步工作对象可以确保主线程不被阻塞,从而提高应用程序的并发性能。
[*] 图像处理:当需要对大型图像进行处理或执行复杂的图像算法时,使用异步工作对象可以确保主线程不被阻塞,从而提高应用程序的实时性能。
异步调用支持callback方式和Promise方式,使用哪种方式由应用开发者决定,通过是否传递callback函数进行区分。
https://img-blog.csdnimg.cn/img_convert/f01ff0b29b99f16b8118ead2c0765ddc.webp?x-oss-process=image/format,png
使用Promise方式示例
https://img-blog.csdnimg.cn/img_convert/491dcdcf1b09fbe0c7b6383571abe083.webp?x-oss-process=image/format,png
[*]使用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;
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, &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;
}
[*]定义异步任务的第一个回调函数,该函数在工作线程中执行,处理具体的业务逻辑。
static void ExecuteCB(napi_env env, void *data)
{
CallbackData *callbackData = reinterpret_cast<CallbackData *>(data);
callbackData->result = callbackData->args;
}
[*]定义异步任务的第二个回调函数,该函数在主线程执行,将结果传递给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;
}
[*]模块初始化以及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), desc);
return exports;
}
// ArkTS侧调用接口
nativeModule.asyncWork(1024).then((result) => {
hilog.info(0x0000, 'XXX', 'result is %{public}d', result);
}
);
使用callback方式示例
https://img-blog.csdnimg.cn/img_convert/de71b41f11f8e99778cbc27791a42762.webp?x-oss-process=image/format,png
[*]使用napi_create_async_work创建异步任务,并使用napi_queue_async_work将异步任务加入队列,等待执行。
struct CallbackData {
napi_async_work asyncWork = nullptr;
napi_ref callbackRef = nullptr;
double args = {0};
double result = 0;
};
napi_value AsyncWork(napi_env env, napi_callback_info info)
{
size_t argc = 3;
napi_value args;
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
auto asyncContext = new CallbackData();
// 将接收到的参数保存到callbackData
napi_get_value_double(env, args, &asyncContext->args);
napi_get_value_double(env, args, &asyncContext->args);
// 将传入的callback转换为napi_ref延长其生命周期,防止被GC掉
napi_create_reference(env, args, 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;
}
[*]定义异步任务的第一个回调函数,该函数在工作线程中执行,处理具体的业务逻辑。
static void ExecuteCB(napi_env env, void *data)
{
CallbackData *callbackData = reinterpret_cast<CallbackData *>(data);
callbackData->result = callbackData->args + callbackData->args;
}
[*]定义异步任务的第二个回调函数,该函数在主线程执行,将结果传递给ArkTS侧。
static void CompleteCB(napi_env env, napi_status status, void *data)
{
CallbackData *callbackData = reinterpret_cast<CallbackData *>(data);
napi_value callbackArg = {nullptr};
napi_create_double(env, callbackData->result, &callbackArg);
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;
}
[*]模块初始化以及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), 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);
});
为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05
《鸿蒙开发学习手册》:
如何快速入门:https://qr21.cn/FV7h05
[*]基本概念
[*]构建第一个ArkTS应用
[*]……
https://img-blog.csdnimg.cn/img_convert/afd6b98a09014e557566dec0fd065c41.webp?x-oss-process=image/format,png
开发基础知识:https://qr21.cn/FV7h05
[*]应用基础知识
[*]配置文件
[*]应用数据管理
[*]应用安全管理
[*]应用隐私保护
[*]三方应用调用管控机制
[*]资源分类与访问
[*]学习ArkTS语言
[*]……
https://img-blog.csdnimg.cn/img_convert/c02d1bcf9201e3d3d8baf3b812f8e370.webp?x-oss-process=image/format,png
基于ArkTS 开发:https://qr21.cn/FV7h05
[*]Ability开发
[*]UI开发
[*]公共事件与通知
[*]窗口管理
[*]媒体
[*]安全
[*]网络与链接
[*]电话服务
[*]数据管理
[*]后台任务(Background Task)管理
[*]设备管理
[*]设备使用信息统计
[*]DFX
[*]国际化开发
[*]折叠屏系列
[*]……
https://img-blog.csdnimg.cn/img_convert/ac0f330dc7d6738a5b1180f68865890c.webp?x-oss-process=image/format,png
鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH
https://img-blog.csdnimg.cn/img_convert/b2b4ab55693c8db2d124f48f0ea89c1d.webp?x-oss-process=image/format,png
鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH
1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向
https://img-blog.csdnimg.cn/img_convert/48b1e7eff01309fe163e3e6dcf6fba55.webp?x-oss-process=image/format,png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]