鸿蒙HarmonyOS应用开发之使用Node-API接口进行异步任务开发 ...

打印 上一主题 下一主题

主题 879|帖子 879|积分 2637

场景介绍

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


  • 文件操作:读取大型文件或执行复杂的文件操作时,可以使用异步工作对象来避免阻塞主线程。
  • 网络请求:当需要进行网络请求并等待响应时,使用异步工作对象可以确保主线程不被阻塞,从而提高应用程序的响应性能。
  • 数据库操作:当需要执行复杂的数据库查询或写入操作时,使用异步工作对象可以确保主线程不被阻塞,从而提高应用程序的并发性能。
  • 图像处理:当需要对大型图像进行处理或执行复杂的图像算法时,使用异步工作对象可以确保主线程不被阻塞,从而提高应用程序的实时性能。
异步调用支持callback方式和Promise方式,使用哪种方式由应用开发者决定,通过是否传递callback函数进行区分。

使用Promise方式示例



  • 使用napi_create_async_work创建异步任务,并使用napi_queue_async_work将异步任务加入队列,等待执行。
  1. struct CallbackData {
  2.     napi_async_work asyncWork = nullptr;
  3.     napi_deferred deferred = nullptr;
  4.     napi_ref callback = nullptr;
  5.     double args = 0;
  6.     double result = 0;
  7. };
  8. static napi_value AsyncWork(napi_env env, napi_callback_info info)
  9. {
  10.    size_t argc = 1;
  11.    napi_value args[1];
  12.    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  13.    napi_value promise = nullptr;
  14.    napi_deferred deferred = nullptr;
  15.    napi_create_promise(env, &deferred, &promise);
  16.    auto callbackData = new CallbackData();
  17.    callbackData->deferred = deferred;
  18.    napi_get_value_double(env, args[0], &callbackData->args);
  19.    napi_value resourceName = nullptr;
  20.    napi_create_string_utf8(env, "AsyncCallback", NAPI_AUTO_LENGTH, &resourceName);
  21.    // 创建异步任务
  22.    napi_create_async_work(env, nullptr, resourceName, ExecuteCB, CompleteCB, callbackData, &callbackData->asyncWork);
  23.    // 将异步任务加入队列
  24.    napi_queue_async_work(env, callbackData->asyncWork);
  25.    return promise;
  26. }
复制代码

  • 定义异步任务的第一个回调函数,该函数在工作线程中执行,处理具体的业务逻辑。
  1. static void ExecuteCB(napi_env env, void *data)
  2. {
  3.     CallbackData *callbackData = reinterpret_cast<CallbackData *>(data);
  4.     callbackData->result = callbackData->args;
  5. }
复制代码

  • 定义异步任务的第二个回调函数,该函数在主线程执行,将结果传递给ArkTS侧。
  1. static void CompleteCB(napi_env env, napi_status status, void *data)
  2. {
  3.     CallbackData *callbackData = reinterpret_cast<CallbackData *>(data);
  4.     napi_value result = nullptr;
  5.     napi_create_double(env, callbackData->result, &result);
  6.     if (callbackData->result > 0) {
  7.         napi_resolve_deferred(env, callbackData->deferred, result);
  8.     } else {
  9.         napi_reject_deferred(env, callbackData->deferred, result);
  10.     }
  11.     napi_delete_async_work(env, callbackData->asyncWork);
  12.     delete callbackData;
  13. }
复制代码

  • 模块初始化以及ArkTS侧调用接口。
  1. // 模块初始化
  2. static napi_value Init(napi_env env, napi_value exports)
  3. {
  4.     napi_property_descriptor desc[] = {
  5.         { "asyncWork", nullptr, AsyncWork, nullptr, nullptr, nullptr, napi_default, nullptr }
  6.     };
  7.     napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
  8.     return exports;
  9. }
  10. // ArkTS侧调用接口
  11. nativeModule.asyncWork(1024).then((result) => {
  12.     hilog.info(0x0000, 'XXX', 'result is %{public}d', result);
  13.   }
  14. );
复制代码
使用callback方式示例



  • 使用napi_create_async_work创建异步任务,并使用napi_queue_async_work将异步任务加入队列,等待执行。
  1. struct CallbackData {
  2.   napi_async_work asyncWork = nullptr;
  3.   napi_ref callbackRef = nullptr;
  4.   double args[2] = {0};
  5.   double result = 0;
  6. };
  7. napi_value AsyncWork(napi_env env, napi_callback_info info)
  8. {
  9.     size_t argc = 3;
  10.     napi_value args[3];
  11.     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
  12.     auto asyncContext = new CallbackData();
  13.     // 将接收到的参数保存到callbackData
  14.     napi_get_value_double(env, args[0], &asyncContext->args[0]);
  15.     napi_get_value_double(env, args[1], &asyncContext->args[1]);
  16.     // 将传入的callback转换为napi_ref延长其生命周期,防止被GC掉
  17.     napi_create_reference(env, args[2], 1, &asyncContext->callbackRef);
  18.     napi_value resourceName = nullptr;
  19.     napi_create_string_utf8(env, "asyncWorkCallback", NAPI_AUTO_LENGTH, &resourceName);
  20.     // 创建异步任务
  21.     napi_create_async_work(env, nullptr, resourceName, ExecuteCB, CompleteCB,
  22.                            asyncContext, &asyncContext->asyncWork);
  23.     // 将异步任务加入队列
  24.     napi_queue_async_work(env, asyncContext->asyncWork);
  25.     return nullptr;
  26. }
复制代码

  • 定义异步任务的第一个回调函数,该函数在工作线程中执行,处理具体的业务逻辑。
  1. static void ExecuteCB(napi_env env, void *data)
  2. {
  3.     CallbackData *callbackData = reinterpret_cast<CallbackData *>(data);
  4.     callbackData->result = callbackData->args[0] + callbackData->args[1];
  5. }
复制代码

  • 定义异步任务的第二个回调函数,该函数在主线程执行,将结果传递给ArkTS侧。
  1. static void CompleteCB(napi_env env, napi_status status, void *data)
  2. {
  3.     CallbackData *callbackData = reinterpret_cast<CallbackData *>(data);
  4.     napi_value callbackArg[1] = {nullptr};
  5.     napi_create_double(env, callbackData->result, &callbackArg[0]);
  6.     napi_value callback = nullptr;
  7.     napi_get_reference_value(env, callbackData->callbackRef, &callback);
  8.     // 执行回调函数
  9.     napi_value result;
  10.     napi_value undefined;
  11.     napi_get_undefined(env, &undefined);
  12.     napi_call_function(env, undefined, callback, 1, callbackArg, &result);
  13.     // 删除napi_ref对象以及异步任务
  14.     napi_delete_reference(env, callbackData->callbackRef);
  15.     napi_delete_async_work(env, callbackData->asyncWork);
  16.     delete callbackData;
  17. }
复制代码

  • 模块初始化以及ArkTS侧调用接口。
  1. // 模块初始化
  2. static napi_value Init(napi_env env, napi_value exports)
  3. {
  4.     napi_property_descriptor desc[] = {
  5.         { "asyncWork", nullptr, AsyncWork, nullptr, nullptr, nullptr, napi_default, nullptr }
  6.     };
  7.     napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
  8.     return exports;
  9. }
  10. // ArkTS侧调用接口
  11. let num1: number = 123;
  12. let num2: number = 456;
  13. nativeModule.asyncWork(num1, num2, (result) => {
  14.   hilog.info(0x0000, 'XXX', 'result is %{public}d', result);
  15. });
复制代码
为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05
《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05


  • 基本概念
  • 构建第一个ArkTS应用
  • ……

开发基础知识:https://qr21.cn/FV7h05


  • 应用基础知识
  • 配置文件
  • 应用数据管理
  • 应用安全管理
  • 应用隐私保护
  • 三方应用调用管控机制
  • 资源分类与访问
  • 学习ArkTS语言
  • ……

基于ArkTS 开发:https://qr21.cn/FV7h05


  • Ability开发
  • UI开发
  • 公共事件与通知
  • 窗口管理
  • 媒体
  • 安全
  • 网络与链接
  • 电话服务
  • 数据管理
  • 后台任务(Background Task)管理
  • 设备管理
  • 设备使用信息统计
  • DFX
  • 国际化开发
  • 折叠屏系列
  • ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH


鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表