- 定义异步任务的第二个回调函数,该函数在主线程执行,将结果传递给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[0]), desc); return exports; }
// ArkTS侧调用接口 nativeModule.asyncWork(1024).then((result) => { hilog.info(0x0000, 'XXX', 'result is %{public}d', result); } );
使用callback方式示例
- 使用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(); // 将接收到的参数保存到callbackData napi_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; }
- 定义异步任务的第一个回调函数,该函数在工作线程中执行,处理具体的业务逻辑。
static void ExecuteCB(napi_env env, void *data) { CallbackData *callbackData = reinterpret_cast<CallbackData *>(data); callbackData->result = callbackData->args[0] + callbackData->args[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; }
- 模块初始化以及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); });
为了能让大家更好的学习鸿蒙(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.架构方向
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新