From 4886c6f87e83658ef8026e9a702dfc6e5fdf670a Mon Sep 17 00:00:00 2001 From: He Su Date: Thu, 3 Jul 2025 16:45:11 +0800 Subject: [PATCH] add native node-interface mutil thread support. Signed-off-by: He Su --- .../reference/apis-arkui/Readme-CN.md | 2 + .../apis-arkui/_ark_u_i___native_module.md | 209 ++- .../apis-arkui/native__interface_8h.md | 2 +- .../reference/apis-arkui/native__node_8h.md | 4 + .../ui/figures/build_on_multi_thread.jpg | Bin 0 -> 187153 bytes .../ui/ndk-build-on-multi-thread-api.md | 1487 +++++++++++++++++ .../ui/ndk-build-on-multi-thread.md | 352 ++++ zh-cn/application-dev/website.md | 1 + 8 files changed, 2055 insertions(+), 2 deletions(-) create mode 100644 zh-cn/application-dev/ui/figures/build_on_multi_thread.jpg create mode 100644 zh-cn/application-dev/ui/ndk-build-on-multi-thread-api.md create mode 100644 zh-cn/application-dev/ui/ndk-build-on-multi-thread.md diff --git a/zh-cn/application-dev/reference/apis-arkui/Readme-CN.md b/zh-cn/application-dev/reference/apis-arkui/Readme-CN.md index ccb096e9bdd..83a2c7d5227 100644 --- a/zh-cn/application-dev/reference/apis-arkui/Readme-CN.md +++ b/zh-cn/application-dev/reference/apis-arkui/Readme-CN.md @@ -543,6 +543,8 @@ - [NativeDisplayManager_DisplayColorSpace](capi-nativedisplaymanager-displaycolorspace.md) - [NativeDisplayManager_DisplayInfo](capi-nativedisplaymanager-displayinfo.md) - [NativeDisplayManager_DisplaysInfo](capi-nativedisplaymanager-displaysinfo.md) + - 多线程 + - [多线程NDK接口说明](../../ui/ndk-build-on-multi-thread-api.md) - 错误码 - UI界面 - [动画错误码](errorcode-animator.md) diff --git a/zh-cn/application-dev/reference/apis-arkui/_ark_u_i___native_module.md b/zh-cn/application-dev/reference/apis-arkui/_ark_u_i___native_module.md index ffdc6460a07..19808b52e38 100644 --- a/zh-cn/application-dev/reference/apis-arkui/_ark_u_i___native_module.md +++ b/zh-cn/application-dev/reference/apis-arkui/_ark_u_i___native_module.md @@ -279,7 +279,7 @@ | [ArkUI_ListItemSwipeEdgeEffect](#arkui_listitemswipeedgeeffect) { ARKUI_LIST_ITEM_SWIPE_EDGE_EFFECT_SPRING = 0, ARKUI_LIST_ITEM_SWIPE_EDGE_EFFECT_NONE } | 定义 Listitem 组件SwipeAction方法的滚动模式。 | | [ArkUI_AnimationStatus](#arkui_animationstatus) { ARKUI_ANIMATION_STATUS_INITIAL, ARKUI_ANIMATION_STATUS_RUNNING, ARKUI_ANIMATION_STATUS_PAUSED, ARKUI_ANIMATION_STATUS_STOPPED } | 定义帧动画的播放状态。 | | [ArkUI_AnimationFillMode](#arkui_animationfillmode) { ARKUI_ANIMATION_FILL_MODE_NONE, ARKUI_ANIMATION_FILL_MODE_FORWARDS, ARKUI_ANIMATION_FILL_MODE_BACKWARDS, ARKUI_ANIMATION_FILL_MODE_BOTH } | 定义帧动画组件在动画开始前和结束后的状态。 | -| [ArkUI_ErrorCode](#arkui_errorcode) {
ARKUI_ERROR_CODE_NO_ERROR = 0, ARKUI_ERROR_CODE_PARAM_INVALID = 401, ARKUI_ERROR_CODE_CAPI_INIT_ERROR = 500, ARKUI_ERROR_CODE_INTERNAL_ERROR = 100001,
ARKUI_ERROR_CODE_XCOMPONENT_STATE_INVALID = 103501, ARKUI_ERROR_CODE_ATTRIBUTE_OR_EVENT_NOT_SUPPORTED = 106102, ARKUI_ERROR_CODE_ARKTS_NODE_NOT_SUPPORTED = 106103, ARKUI_ERROR_CODE_ADAPTER_NOT_BOUND = 106104,
ARKUI_ERROR_CODE_ADAPTER_EXIST = 106105, ARKUI_ERROR_CODE_CHILD_NODE_EXIST = 106106, ARKUI_ERROR_CODE_NODE_EVENT_PARAM_INDEX_OUT_OF_RANGE = 106107, ARKUI_ERROR_CODE_NODE_EVENT_PARAM_INVALID = 106108,
ARKUI_ERROR_CODE_NODE_EVENT_NO_RETURN = 106109, ARKUI_ERROR_CODE_NODE_INDEX_INVALID = 106200, ARKUI_ERROR_CODE_GET_INFO_FAILED = 106201, ARKUI_ERROR_CODE_BUFFER_SIZE_ERROR = 106202,
ARKUI_ERROR_CODE_NODE_NOT_ON_MAIN_TREE = 106203, ARKUI_ERROR_CODE_FOCUS_NON_FOCUSABLE = 150001, ARKUI_ERROR_CODE_FOCUS_NON_FOCUSABLE_ANCESTOR = 150002, ARKUI_ERROR_CODE_FOCUS_NON_EXISTENT = 150003,
ARKUI_ERROR_CODE_COMPONENT_SNAPSHOT_TIMEOUT = 160002, ARKUI_ERROR_CODE_NON_SCROLLABLE_CONTAINER = 180001, ARKUI_ERROR_CODE_BUFFER_SIZE_NOT_ENOUGH = 180002, ARKUI_ERROR_CODE_NOT_CLONED_POINTER_EVENT = 180003,
ARKUI_ERROR_CODE_POST_CLONED_COMPONENT_STATUS_ABNORMAL = 180004, ARKUI_ERROR_CODE_POST_CLONED_NO_COMPONENT_HIT_TO_RESPOND_TO_THE_EVENT = 180005, ARKUI_ERROR_INPUT_EVENT_TYPE_NOT_SUPPORTED = 180006,
ARKUI_ERROR_CODE_INVALID_STYLED_STRING = 180101, ARKUI_ERROR_CODE_UI_CONTEXT_INVALID = 190001,
ARKUI_ERROR_CODE_CALLBACK_INVALID = 190002, ARKUI_ERROR_CODE_RECOGNIZER_TYPE_NOT_SUPPORTED = 180102, ARKUI_ERROR_CODE_DRAG_DROP_OPERATION_NOT_ALLOWED = 190004
} | 定义错误码枚举值。 | +| [ArkUI_ErrorCode](#arkui_errorcode) {
ARKUI_ERROR_CODE_NO_ERROR = 0, ARKUI_ERROR_CODE_PARAM_INVALID = 401, ARKUI_ERROR_CODE_CAPI_INIT_ERROR = 500, ARKUI_ERROR_CODE_INTERNAL_ERROR = 100001,
ARKUI_ERROR_CODE_XCOMPONENT_STATE_INVALID = 103501, ARKUI_ERROR_CODE_ATTRIBUTE_OR_EVENT_NOT_SUPPORTED = 106102, ARKUI_ERROR_CODE_ARKTS_NODE_NOT_SUPPORTED = 106103, ARKUI_ERROR_CODE_ADAPTER_NOT_BOUND = 106104,
ARKUI_ERROR_CODE_ADAPTER_EXIST = 106105, ARKUI_ERROR_CODE_CHILD_NODE_EXIST = 106106, ARKUI_ERROR_CODE_NODE_EVENT_PARAM_INDEX_OUT_OF_RANGE = 106107, ARKUI_ERROR_CODE_NODE_EVENT_PARAM_INVALID = 106108,
ARKUI_ERROR_CODE_NODE_EVENT_NO_RETURN = 106109, ARKUI_ERROR_CODE_NODE_INDEX_INVALID = 106200, ARKUI_ERROR_CODE_GET_INFO_FAILED = 106201, ARKUI_ERROR_CODE_BUFFER_SIZE_ERROR = 106202,
ARKUI_ERROR_CODE_NODE_NOT_ON_MAIN_TREE = 106203, ARKUI_ERROR_CODE_ON_INVALID_THREAD = 106204, ARKUI_ERROR_CODE_FOCUS_NON_FOCUSABLE = 150001, ARKUI_ERROR_CODE_FOCUS_NON_FOCUSABLE_ANCESTOR = 150002, ARKUI_ERROR_CODE_FOCUS_NON_EXISTENT = 150003,
ARKUI_ERROR_CODE_COMPONENT_SNAPSHOT_TIMEOUT = 160002, ARKUI_ERROR_CODE_NON_SCROLLABLE_CONTAINER = 180001, ARKUI_ERROR_CODE_BUFFER_SIZE_NOT_ENOUGH = 180002, ARKUI_ERROR_CODE_NOT_CLONED_POINTER_EVENT = 180003,
ARKUI_ERROR_CODE_POST_CLONED_COMPONENT_STATUS_ABNORMAL = 180004, ARKUI_ERROR_CODE_POST_CLONED_NO_COMPONENT_HIT_TO_RESPOND_TO_THE_EVENT = 180005, ARKUI_ERROR_INPUT_EVENT_TYPE_NOT_SUPPORTED = 180006,
ARKUI_ERROR_CODE_INVALID_STYLED_STRING = 180101, ARKUI_ERROR_CODE_UI_CONTEXT_INVALID = 190001,
ARKUI_ERROR_CODE_CALLBACK_INVALID = 190002, ARKUI_ERROR_CODE_RECOGNIZER_TYPE_NOT_SUPPORTED = 180102, ARKUI_ERROR_CODE_DRAG_DROP_OPERATION_NOT_ALLOWED = 190004
} | 定义错误码枚举值。 | | [ArkUI_ScrollSource](#arkui_scrollsource) {
ARKUI_SCROLL_SOURCE_DRAG = 0, ARKUI_SCROLL_SOURCE_FLING, ARKUI_SCROLL_SOURCE_EDGE_EFFECT, ARKUI_SCROLL_SOURCE_OTHER_USER_INPUT,
ARKUI_SCROLL_SOURCE_SCROLL_BAR, ARKUI_SCROLL_SOURCE_SCROLL_BAR_FLING, ARKUI_SCROLL_SOURCE_SCROLLER, ARKUI_SCROLL_SOURCE_ANIMATION
} | 定义滚动来源枚举值。 | | [ArkUI_SafeAreaType](#arkui_safeareatype) { ARKUI_SAFE_AREA_TYPE_SYSTEM = 1, ARKUI_SAFE_AREA_TYPE_CUTOUT = 1 << 1, ARKUI_SAFE_AREA_TYPE_KEYBOARD = 1 << 2 } | 定义扩展安全区域的枚举值。 | | [ArkUI_ListItemGroupArea](#arkui_listitemgrouparea) { ARKUI_LIST_ITEM_GROUP_AREA_OUTSIDE = 0, ARKUI_LIST_ITEM_SWIPE_AREA_NONE = 1, ARKUI_LIST_ITEM_SWIPE_AREA_ITEM = 2, ARKUI_LIST_ITEM_SWIPE_AREA_HEADER = 3, ARKUI_LIST_ITEM_SWIPE_AREA_FOOTER = 4
} | 定义组件区域的枚举值。 | @@ -2684,6 +2684,7 @@ enum ArkUI_ErrorCode | ARKUI_ERROR_CODE_GET_INFO_FAILED = 106201 | 查询路由导航信息失败。
错误码的详细介绍请参见[导航错误码](../apis-arkui/errorcode-router.md#106201-查询路由导航信息失败)。 | | ARKUI_ERROR_CODE_BUFFER_SIZE_ERROR = 106202 | 传入的buffer size异常。
错误码的详细介绍请参见[导航错误码](../apis-arkui/errorcode-router.md#106202-传入的buffer-size异常)。 | | ARKUI_ERROR_CODE_NODE_NOT_ON_MAIN_TREE = 106203 | 传入的节点未挂载到组件树上。
错误码的详细介绍请参见[自定义节点错误码](../apis-arkui/errorcode-node.md)。
起始版本:15 | +| ARKUI_ERROR_CODE_NODE_ON_INVALID_THREAD = 106204 | 此节点未在合法的线程上操作。
**起始版本:** 20 | | ARKUI_ERROR_CODE_FOCUS_NON_FOCUSABLE = 150001 | 当前节点无法获得焦点。
错误码的详细介绍请参见[焦点错误码](../apis-arkui/errorcode-focus.md#150001-节点无法获得焦点)。
起始版本:15 | | ARKUI_ERROR_CODE_FOCUS_NON_FOCUSABLE_ANCESTOR = 150002 | 当前节点对应的祖先节点中存在无法获焦节点。
错误码的详细介绍请参见[焦点错误码](../apis-arkui/errorcode-focus.md#150002-祖先节点无法获得焦点)。
起始版本:15 | | ARKUI_ERROR_CODE_FOCUS_NON_EXISTENT = 150003 | 当前节点不存在。
错误码的详细介绍请参见[焦点错误码](../apis-arkui/errorcode-focus.md#150003-节点不存在)。
起始版本:15 | @@ -3520,6 +3521,7 @@ enum ArkUI_NativeAPIVariantKind | ARKUI_NATIVE_DIALOG | 弹窗相关接口类型,详见<arkui/native_dialog.h>中的结构体类型定义。 | | ARKUI_NATIVE_GESTURE | 手势相关接口类型,详见<arkui/native_gesture.h>中的结构体类型定义。 | | ARKUI_NATIVE_ANIMATE | 动画相关接口类型。详见<arkui/native_animate.h>中的结构体类型定义。 | +| ARKUI_MULTI_THREAD_NATIVE_NODE | 多线程UI组件相关接口类型。详见<arkui/native_node.h>中的结构体类型定义。 | ### ArkUI_NavDestinationState @@ -19570,3 +19572,208 @@ void OH_ArkUI_EmbeddedComponentOption_SetOnTerminated(ArkUI_EmbeddedComponentOpt | option | EmbeddedComponent组件选项的对象的指针。| | code | 被拉起EmbeddedUIExtensionAbility退出时返回的结果码。若Ability通过调用terminateSelfWithResult退出,结果码为Ability设置的值。若Ability通过调用terminateSelf退出,结果码为默认值"0"。| | want | 被拉起EmbeddedUIExtensionAbility退出时返回的数据。| + +### OH_ArkUI_PostAsyncUITask() + +``` +int32_t OH_ArkUI_PostAsyncUITask(ArkUI_ContextHandle context, void* asyncUITaskData, + void (*asyncUITask)(void* asyncUITaskData), void (*onFinish)(void* asyncUITaskData)) +``` +**描述:** + +将UI任务抛到框架提供的非UI线程中执行。 + +适用于UI组件创建并行化场景,开发者可以使用此接口在非UI线程创建UI组件,创建完成后回到UI线程将其挂载到UI树上。 + +**起始版本:** 20 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| uiContext | UI实例对象指针。 | +| asyncUITaskData | 开发者自定义数据指针,作为asyncUITask和onFinish的入参。 | +| asyncUITask| 在非UI线程执行的函数。| +| onFinish | asyncUITask执行完成后,在UI线程执行的函数。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](_ark_u_i___native_module.md#arkui_errorcode) 成功。 +[ARKUI_ERROR_CODE_PARAM_INVALID](_ark_u_i___native_module.md#arkui_errorcode) uiContext或asyncUITask为空指针。 + +**示例代码:** + +``` cpp +struct AsyncData { + ArkUI_NodeHandle parent = nullptr; + ArkUI_NodeHandle child = nullptr; + ArkUI_NativeNodeAPI_1 *multiThreadNodeAPI = nullptr; +}; + +// 组件多线程创建完成后,回到主线程挂载 +void MountNodeTree(void *asyncUITaskData) { + auto parent = asyncData->parent; + auto child = asyncData->child; + multiThreadNodeAPI->addChild(parent, child); + delete asyncData; +} + +// 多线程的组件创建接口 +void CreateNodeTree(void *asyncUITaskData) { + asyncData->child = multiThreadNodeAPI->createNode(ARKUI_NODE_BUTTON); + ArkUI_AttributeItem label_item = { .string = "button" }; + multiThreadNodeAPI->setAttribute(button1, NODE_BUTTON_LABEL, &label_item); +} + +napi_value CreateNodeTreeOnMultiThread(napi_env env, napi_callback_info info) { + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + ArkUI_ContextHandle contextHandle; + OH_ArkUI_GetContextFromNapiValue(env, args[0], &contextHandle); + ArkUI_NativeNodeAPI_1 *multiThreadNodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeAPI); + AsyncData* asyncData = new AsyncData(); + asyncData->parent = multiThreadNodeAPI->createNode(ARKUI_NODE_ROW); + asyncData->multiThreadNodeAPI = multiThreadNodeAPI; + // 在框架提供的线程池中创建UI组件 + OH_ArkUI_PostAsyncUITask(contextHandle, asyncData, CreateNodeTree, MountNodeTree); +} +``` + +### OH_ArkUI_PostUITask() + +``` +int32_t OH_ArkUI_PostUITask(ArkUI_ContextHandle context, void* taskData, void (*task)(void* taskData)) +``` +**描述:** + +将UI任务抛到UI线程中执行。 + +适用于UI组件创建并行化场景,当开发者需要在自己维护的非UI线程中创建UI组件,使用此接口在UI线程将非UI线程创建的组件挂载到UI树上。 + +**起始版本:** 20 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| uiContext | UI实例对象指针。 | +| taskData | 开发者自定义数据指针,作为task的入参。 | +| task | 在UI线程执行的函数。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](_ark_u_i___native_module.md#arkui_errorcode) 成功。 +[ARKUI_ERROR_CODE_PARAM_INVALID](_ark_u_i___native_module.md#arkui_errorcode) uiContext或task为空指针。 + +**示例代码:** + +``` cpp +struct AsyncData { + ArkUI_NodeHandle parent = nullptr; + ArkUI_NodeHandle child = nullptr; + ArkUI_NativeNodeAPI_1 *multiThreadNodeAPI = nullptr; +}; + +// 组件多线程创建完成后,回到主线程挂载 +void MountNodeTree(void *asyncUITaskData) { + auto parent = asyncData->parent; + auto child = asyncData->child; + multiThreadNodeAPI->addChild(parent, child); + delete asyncData; +} + +// 多线程的组件创建接口 +void CreateNodeTree(void *asyncUITaskData) { + asyncData->child = multiThreadNodeAPI->createNode(ARKUI_NODE_BUTTON); + ArkUI_AttributeItem label_item = { .string = "button" }; + multiThreadNodeAPI->setAttribute(button1, NODE_BUTTON_LABEL, &label_item); + OH_ArkUI_PostAsyncUITask(contextHandle, asyncData, MountNodeTree); +} + +napi_value CreateNodeTreeOnMultiThread(napi_env env, napi_callback_info info) { + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + ArkUI_ContextHandle contextHandle; + OH_ArkUI_GetContextFromNapiValue(env, args[0], &contextHandle); + ArkUI_NativeNodeAPI_1 *multiThreadNodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeAPI); + AsyncData* asyncData = new AsyncData(); + asyncData->parent = multiThreadNodeAPI->createNode(ARKUI_NODE_ROW); + asyncData->multiThreadNodeAPI = multiThreadNodeAPI; + // 在开发者维护的非UI线程中创建UI组件 + std::thread t(CreateNodeTree, asyncData); +} +``` + +### OH_ArkUI_PostUITaskAndWait() + +``` +int32_t OH_ArkUI_PostUITaskAndWait(ArkUI_ContextHandle context, void* taskData, void (*task)(void* taskData)) +``` +**描述:** + +将UI任务抛到UI线程中执行,调用此接口的线程阻塞等待UI线程中的UI任务执行完成。 + +适用于UI组件创建并行化场景,当开发者在非UI线程创建组件的过程中需要执行只支持UI线程的业务逻辑时,使用此接口回到UI线程执行业务逻辑,业务完成后继续在非UI线程创建组件。 + +可能导致非UI线程长时间阻塞,不建议频繁使用。 + + +**起始版本:** 20 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| uiContext | UI实例对象指针。 | +| taskData | 开发者自定义数据指针,作为task的入参。 | +| task | 在UI线程执行的函数。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](_ark_u_i___native_module.md#arkui_errorcode) 成功。 +[ARKUI_ERROR_CODE_PARAM_INVALID](_ark_u_i___native_module.md#arkui_errorcode) uiContext或task为空指针。 + +**示例代码:** + +``` cpp +struct AsyncData { + ArkUI_NodeHandle parent = nullptr; + ArkUI_NodeHandle child = nullptr; + ArkUI_NativeNodeAPI_1 *multiThreadNodeAPI = nullptr; +}; + +// 组件多线程创建完成后,回到主线程挂载 +void MountNodeTree(void *asyncUITaskData) { + auto parent = asyncData->parent; + auto child = asyncData->child; + multiThreadNodeAPI->addChild(parent, child); + delete asyncData; +} + +// 多线程的组件创建接口 +void CreateNodeTree(void *asyncUITaskData) { + asyncData->child = multiThreadNodeAPI->createNode(ARKUI_NODE_BUTTON); + ArkUI_AttributeItem label_item = { .string = "button" }; + multiThreadNodeAPI->setAttribute(button1, NODE_BUTTON_LABEL, &label_item); + OH_ArkUI_PostUITaskAndWait(contextHandle, asyncData, MountNodeTree); +} + +napi_value CreateNodeTreeOnMultiThread(napi_env env, napi_callback_info info) { + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + ArkUI_ContextHandle contextHandle; + OH_ArkUI_GetContextFromNapiValue(env, args[0], &contextHandle); + ArkUI_NativeNodeAPI_1 *multiThreadNodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeAPI); + AsyncData* asyncData = new AsyncData(); + asyncData->parent = multiThreadNodeAPI->createNode(ARKUI_NODE_ROW); + asyncData->multiThreadNodeAPI = multiThreadNodeAPI; + // 在开发者维护的非UI线程中创建UI组件 + std::thread t(CreateNodeTree, asyncData); +} +``` diff --git a/zh-cn/application-dev/reference/apis-arkui/native__interface_8h.md b/zh-cn/application-dev/reference/apis-arkui/native__interface_8h.md index 888e6e2b91c..b63e20d6b6e 100644 --- a/zh-cn/application-dev/reference/apis-arkui/native__interface_8h.md +++ b/zh-cn/application-dev/reference/apis-arkui/native__interface_8h.md @@ -30,7 +30,7 @@ | 名称 | 描述 | | -------- | -------- | -| [ArkUI_NativeAPIVariantKind](_ark_u_i___native_module.md#arkui_nativeapivariantkind) { ARKUI_NATIVE_NODE, ARKUI_NATIVE_DIALOG, ARKUI_NATIVE_GESTURE, ARKUI_NATIVE_ANIMATE } | 定义Native接口集合类型。 | +| [ArkUI_NativeAPIVariantKind](_ark_u_i___native_module.md#arkui_nativeapivariantkind) { ARKUI_NATIVE_NODE, ARKUI_NATIVE_DIALOG, ARKUI_NATIVE_GESTURE, ARKUI_NATIVE_ANIMATE, ARKUI_MULTI_THREAD_NATIVE_NODE } | 定义Native接口集合类型。 | ### 函数 diff --git a/zh-cn/application-dev/reference/apis-arkui/native__node_8h.md b/zh-cn/application-dev/reference/apis-arkui/native__node_8h.md index 4ebd150db90..3acc64a43c0 100644 --- a/zh-cn/application-dev/reference/apis-arkui/native__node_8h.md +++ b/zh-cn/application-dev/reference/apis-arkui/native__node_8h.md @@ -158,3 +158,7 @@ NODE_TEXT_AREA_HALF_LEADING = 8025, NODE_TEXT_AREA_KEYBOARD_APPEARANCE = 8026, N | int32_t [OH_ArkUI_NodeUtils_SetCrossLanguageOption](_ark_u_i___native_module.md#oh_arkui_nodeutils_setcrosslanguageoption)([ArkUI_NodeHandle](_ark_u_i___native_module.md#arkui_nodehandle) node, ArkUI_CrossLanguageOption* option) | 设置目标节点跨语言的配置。
**起始版本:** 15 | | int32_t [OH_ArkUI_NodeUtils_GetCrossLanguageOption](_ark_u_i___native_module.md#oh_arkui_nodeutils_getcrosslanguageoption)([ArkUI_NodeHandle](_ark_u_i___native_module.md#arkui_nodehandle) node, ArkUI_CrossLanguageOption* option) | 获取目标节点跨语言的配置。
**起始版本:** 15 | | int32_t [OH_ArkUI_NodeUtils_GetAttachedNodeHandleById](_ark_u_i___native_module.md#oh_arkui_nodeutils_getattachednodehandlebyid)(const char* id, [ArkUI_NodeHandle](_ark_u_i___native_module.md#arkui_nodehandle)* node) | 根据传入的id获取当前节点树上对应的目标节点。
**起始版本:** 15 | +| int32_t [OH_ArkUI_PostAsyncUITask](_ark_u_i___native_module.md#oh_arkui_postasyncuitask)([ArkUI_ContextHandle](_ark_u_i___native_module.md#arkui_contexthandle-12) uiContext, void* asyncUITaskData, void (*asyncUITask)(void* asyncUITaskData), void (*onFinish)(void* asyncUITaskData)) | 将UI任务抛到框架提供的非UI线程中执行。
**起始版本:** 20 | +| int32_t [OH_ArkUI_PostUITask](_ark_u_i___native_module.md#oh_arkui_postuitask)([ArkUI_ContextHandle](_ark_u_i___native_module.md#arkui_contexthandle-12) uiContext, void* taskData, void (*task)(void* taskData)) | 将任务抛到UI线程中执行。
**起始版本:** 20 | +| int32_t [OH_ArkUI_PostUITaskAndWait](_ark_u_i___native_module.md#oh_arkui_postuitaskandwait)([ArkUI_ContextHandle](_ark_u_i___native_module.md#arkui_contexthandle-12) uiContext, void* taskData, void (*task)(void* taskData)) | 将任务抛到UI线程中执行并阻塞等待。
**起始版本:** 20 | + diff --git a/zh-cn/application-dev/ui/figures/build_on_multi_thread.jpg b/zh-cn/application-dev/ui/figures/build_on_multi_thread.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c6c0b2f8911a4735864971567e9fd8817f264303 GIT binary patch literal 187153 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 literal 0 HcmV?d00001 diff --git a/zh-cn/application-dev/ui/ndk-build-on-multi-thread-api.md b/zh-cn/application-dev/ui/ndk-build-on-multi-thread-api.md new file mode 100644 index 00000000000..ff673294bb3 --- /dev/null +++ b/zh-cn/application-dev/ui/ndk-build-on-multi-thread-api.md @@ -0,0 +1,1487 @@ +# 多线程NDK接口说明 + +为保证接口易用性,多线程Native侧Node接口集合与[ArkUI_NativeNodeAPI_1](../reference/apis-arkui/_ark_u_i___native_node_a_p_i__1.md)声明一致。API集合中[组件创建销毁](#组件创建销毁),[属性读写](#组件属性读写),[事件注册解注册](#组件事件注册解注册),[自定义数据读写](#组件自定义数据读写)和[组件树操作](#组件树操作)等接口支持多线程调用,[组件测算布局](#组件测算布局)接口只支持UI线程调用。 + +## 组件创建销毁 + +| 接口名 | 描述 | 非UI线程调用 | 多线程规格 | +| -------- | ------- | ------- | ------- | +| [ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle)(\* [createNode](#createnode) )([ArkUI_NodeType](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodetype) type) | 基于[ArkUI_NodeType](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodetype)生成对应的节点并返回节点对象指针。 | 支持 | 支持在任意线程调用。 | +| void(\* [disposeNode](#disposenode) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node) | 销毁节点指针指向的节点对象。 | 支持 | 在非UI线程操作不符合要求的node接口调用不生效。 | + +## 组件属性读写 + +| 接口名 | 描述 | 非UI线程调用 | 多线程规格 | +| -------- | ------- | ------- | ------- | +| int32_t(\* [setAttribute](#setattribute) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node, [ArkUI_NodeAttributeType](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodeattributetype) attribute, const [ArkUI_AttributeItem](_ark_u_i___attribute_item.md) \*item) | 设置node节点的属性。 | 支持 | 在非UI线程操作不符合要求的node返回错误码。 | +| const [ArkUI_AttributeItem](_ark_u_i___attribute_item.md) \*(\* [getAttribute](#getattribute) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node, [ArkUI_NodeAttributeType](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodeattributetype) attribute) | 获取node节点的属性。 | 支持 | 在非UI线程操作不符合要求的node返回空指针。 | +| int32_t(\* [resetAttribute](#resetattribute) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node, [ArkUI_NodeAttributeType](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodeattributetype) attribute) | 重置node节点的属性为默认值。 | 支持 | 在非UI线程操作不符合要求的node返回错误码。 | +| int32_t(\* [setLengthMetricUnit](#setlengthmetricunit) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node, [ArkUI_LengthMetricUnit](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_lengthmetricunit) unit) | 指定node节点的单位。 | 支持 | 在非UI线程操作不符合要求的node返回错误码。 | + +## 组件事件注册解注册 + +| 接口名 | 描述 | 非UI线程调用 | 多线程规格 | +| -------- | ------- | ------- | ------- | +| int32_t(\* [registerNodeEvent](#registernodeevent) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node, [ArkUI_NodeEventType](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodeeventtype) eventType, int32_t targetId, void \*userData) | 向node节点注册事件。 | 支持 | 在非UI线程操作不符合要求的node返回错误码。 | +| void(\* [unregisterNodeEvent](#unregisternodeevent) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node, [ArkUI_NodeEventType](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodeeventtype) eventType) | node节点解注册事件。 | 支持 | 在非UI线程操作不符合要求的node接口调用无效。 | +| int32_t(\* [registerNodeCustomEvent](#registernodecustomevent) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node, [ArkUI_NodeCustomEventType](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodecustomeventtype) eventType, int32_t targetId, void \*userData) | 向node节点注册自定义事件。 | 支持 | 在非UI线程操作不符合要求的node返回错误码。 | +| void(\* [unregisterNodeCustomEvent](#unregisternodecustomevent) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node, [ArkUI_NodeCustomEventType](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodecustomeventtype) eventType) | node节点解注册自定义事件。 | 支持 | 在非UI线程操作不符合要求的node接口调用不生效。 | +| int32_t(\* [addNodeEventReceiver](#addnodeeventreceiver) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node, void(\*eventReceiver)([ArkUI_NodeEvent](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodeevent-12) \*event)) | 向node节点注册事件回调函数,用于接收该组件产生的组件事件。 | 支持 | 在非UI线程操作不符合要求的node返回错误码。 | +| int32_t(\* [removeNodeEventReceiver](#removenodeeventreceiver) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node, void(\*eventReceiver)([ArkUI_NodeEvent](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodeevent-12) \*event)) | 删除node节点上注册的事件回调函数。 | 支持 | 在在非UI线程操作不符合要求的node返回错误码。 | +| int32_t(\* [addNodeCustomEventReceiver](#addnodecustomeventreceiver) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node, void(\*eventReceiver)([ArkUI_NodeCustomEvent](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodecustomevent) \*event)) | 向node节点注册自定义事件回调函数,用于接收该组件产生的自定义事件(如布局事件,绘制事件)。 | 支持 | 在非UI线程操作不符合要求的node返回错误码。 | +| int32_t(\* [removeNodeCustomEventReceiver](#removenodecustomeventreceiver) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node, void(\*eventReceiver)([ArkUI_NodeCustomEvent](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodecustomevent) \*event)) | 删除node节点上注册的自定义事件回调函数。 | 支持 | 在非UI线程操作不符合要求的node返回错误码。 | +| void(\* [registerNodeEventReceiver](#registernodeeventreceiver) )(void(\*eventReceiver)([ArkUI_NodeEvent](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodeevent-12) \*event)) | 注册节点事件回调统一入口函数。 | 不支持 | 只支持UI线程调用,否则接口调用不生效。 | +| void(\* [unregisterNodeEventReceiver](#unregisternodeeventreceiver) )() | 解注册节点事件回调统一入口函数。 | 不支持 | 只支持UI线程调用,否则接口调用不生效。 | +| void(\* [registerNodeCustomEventReceiver](#registernodecustomeventreceiver) )(void(\*eventReceiver)([ArkUI_NodeCustomEvent](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodecustomevent) \*event)) | 注册节点自定义事件回调统一入口函数。 | 不支持 | 只支持UI线程调用,否则接口调用不生效。 | +| void(\* [unregisterNodeCustomEventReceiver](#unregisternodecustomeventreceiver) )() | 解注册节点自定义事件回调统一入口函数。 | 不支持 | 只支持UI线程调用,否则接口调用不生效。 | + +## 组件树操作 + +| 接口名 | 描述 | 非UI线程调用 | 多线程规格 | +| -------- | ------- | ------- | ------- | +| int32_t(\* [addChild](#addchild) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) parent, [ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) child) | 将child节点挂载到parent节点的子节点列表中。 | 支持 | 在非UI线程操作不符合要求的parent返回错误码。 | +| int32_t(\* [removeChild](#removechild) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) parent, [ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) child) | 将child节点从parent节点的子节点列表中移除。 | 支持 | 在非UI线程操作不符合要求的parent返回错误码。 | +| int32_t(\* [insertChildAfter](#insertchildafter) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) parent, [ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) child, [ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) sibling) | 将child节点挂载到parent节点的子节点列表中,挂载位置在sibling节点之后。 | 支持 | 在非UI线程操作不符合要求的parent返回错误码。 | +| int32_t(\* [insertChildBefore](#insertchildbefore) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) parent, [ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) child, [ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) sibling) | 将child节点挂载到parent节点的子节点列表中,挂载位置在sibling节点之前。 | 支持 | 在非UI线程操作不符合要求的parent返回错误码。 | +| int32_t(\* [insertChildAt](#insertchildat) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) parent, [ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) child, int32_t position) | 将child节点挂载到parent节点的子节点列表中,挂载位置由position指定。 | 支持 | 在非UI线程操作不符合要求的parent返回错误码。 | +| [ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle)(\* [getParent](#getparent) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node) | 获取node节点的父节点。 | 支持 | 在非UI线程操作不符合要求的node返回错误码。 | +| int32_t(\* [removeAllChildren](#removeallchildren) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) parent) | 移除node节点的所有子节点。 | 支持 | 在非UI线程操作不符合要求的parent返回错误码。 | +| uint32_t(\* [getTotalChildCount](#gettotalchildcount) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node) | 获取node节点的子节点个数。 | 支持 | 在非UI线程操作不符合要求的node接口返回0。 | +| [ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle)(\* [getChildAt](#getchildat) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node, int32_t position) | 获取node节点的子节点指针,位置由position指定。 | 支持 | 在非UI线程操作不符合要求的node接口返回空指针。 | +| [ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle)(\* [getFirstChild](#getfirstchild) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node) | 获取node节点的第一个子节点指针。 | 支持 | 在非UI线程操作不符合要求的node接口返回空指针。 | +| [ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle)(\* [getLastChild](#getlastchild) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node) | 获取node节点的最后一个子节点指针。 | 支持 | 在非UI线程操作不符合要求的node接口返回空指针。 | +| [ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle)(\* [getPreviousSibling](#getprevioussibling) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node) | 获取node节点的上一个兄弟节点指针。 | 支持 | 在非UI线程操作不符合要求的node接口返回空指针。 | +| [ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle)(\* [getNextSibling](#getnextsibling) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node) | 获取node节点的下一个兄弟节点指针。 | 支持 | 在非UI线程操作不符合要求的node接口返回空指针。 | + +## 组件自定义数据读写 + +| 接口名 | 描述 | 非UI线程调用 | 多线程规格 | +| -------- | ------- | ------- | ------- | +| int32_t(\* [setUserData](#setuserdata) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node, void \*userData) | 在node节点上保存自定义数据。 | 支持 | 在非UI线程操作不符合要求的node接口返回错误码。 | +| void \*(\* [getUserData](#getuserdata) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node) | 获取node节点上保存的自定义数据。 | 支持 | 在非UI线程操作不符合要求的node接口返回空指针。 | + +## 组件测算布局 + +| 接口名 | 描述 | 非UI线程调用 | 多线程规格 | +| -------- | ------- | ------- | ------- | +| int32_t(\* [setMeasuredSize](#setmeasuredsize) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node, int32_t width, int32_t height) | 在测算回调函数中设置组件测算完成后的宽和高。 | 不支持 | 只支持UI线程调用,否则接口返回错误码。 | +| int32_t(\* [setLayoutPosition](#setlayoutposition) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node, int32_t positionX, int32_t positionY) | 在布局回调函数中设置组件的位置。 | 不支持 | 只支持UI线程调用,否则接口返回错误码。 | +| [ArkUI_IntSize](_ark_u_i___int_size.md)(\* [getMeasuredSize](#getmeasuredsize) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node) | 获取node节点测算完成后的宽高尺寸。 | 不支持 | 只支持UI线程调用,否则接口返回默认值。 | +| [ArkUI_IntOffset](_ark_u_i___int_offset.md)(\* [getLayoutPosition](#getlayoutposition) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node) | 获取node节点布局完成后的位置。 | 不支持 | 只支持UI线程调用,否则接口返回默认值。 | +| int32_t(\* [measureNode](#measurenode) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node, [ArkUI_LayoutConstraint](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_layoutconstraint) \*Constraint) | 对node节点进行测算,可以通过getMeasuredSize获取测算后的大小。 | 不支持 | 只支持UI线程调用,否则接口返回错误码。 | +| int32_t(\* [layoutNode](#layoutnode) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node, int32_t positionX, int32_t positionY) | 对node节点进行布局并传递该组件相对父组件的期望位置。 | 不支持 | 只支持UI线程调用,否则接口返回错误码。 | +| void(\* [markDirty](#markdirty) )([ArkUI_NodeHandle](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodehandle) node, [ArkUI_NodeDirtyFlag](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodedirtyflag) dirtyFlag) | 强制标记node节点需要重新测算、布局或绘制。 | 不支持 | 只支持UI线程调用,否则接口调用不生效。 | + + +## 接口详细说明 + + +### addChild + +``` +int32_t(* ArkUI_NativeNodeAPI_1::addChild) (ArkUI_NodeHandle parent, ArkUI_NodeHandle child) +``` +**描述:** + +将节点挂载到某个父节点下。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回错误码。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| parent | 父节点指针。 | +| child | 子节点指针。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)成功。 + +[ARKUI_ERROR_CODE_PARAM_INVALID](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)函数参数异常。 + +[ARKUI_ERROR_CODE_NOT_SUPPORTED_FOR_ARKTS_NODE](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止对BuilderNode生成的节点, 进行设置属性、重置属性、设置事件与新增或修改子节点操作。 + +[ARKUI_ERROR_CODE_ON_INVALID_THREAD](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止在非UI线程调用函数操作已挂载到UI树上的节点。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); + +auto parent = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +auto child = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +multiThreadNodeApi->addChild(parent, child); +``` + +### addNodeCustomEventReceiver + +``` +int32_t(* ArkUI_NativeNodeAPI_1::addNodeCustomEventReceiver) (ArkUI_NodeHandle node, void(*eventReceiver)(ArkUI_NodeCustomEvent *event)) +``` +**描述:** + +在节点上添加自定义事件回调函数,用于接受该节点产生的自定义事件(如布局事件,绘制事件)。 + +不同于registerNodeCustomEventReceiver的全局注册函数,该函数允许在同一个节点上添加多个事件接受器。 + +该函数添加的监听回调函数触发时机会先于registerNodeCustomEventReceiver注册的全局回调函数。 + +避免直接保存ArkUI_NodeCustomEvent对象指针,数据会在回调结束后销毁。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回错误码。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 用于添加组件自定义事件回调函数的对象。 | +| eventReceiver | 组件自定义事件回调函数。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)成功。 + +[ARKUI_ERROR_CODE_PARAM_INVALID](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)函数参数异常。 + +[ARKUI_ERROR_CODE_ON_INVALID_THREAD](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止在非UI线程调用函数操作已挂载到UI树上的节点。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); + +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_CUSTOM); +auto receiver = [](ArkUI_NodeCustomEvent *event) {}; +multiThreadNodeApi->addNodeCustomEventReceiver(node, receiver); +``` + +### addNodeEventReceiver + +``` +int32_t(* ArkUI_NativeNodeAPI_1::addNodeEventReceiver) (ArkUI_NodeHandle node, void(*eventReceiver)(ArkUI_NodeEvent *event)) +``` +**描述:** + +在节点上添加节点事件回调函数,用于接受该节点产生的节点事件。 + +不同于registerNodeEventReceiver的全局注册函数,该函数允许在同一个节点上添加多个事件接受器。 + +该函数添加的监听回调函数触发时机会先于registerNodeEventReceiver注册的全局回调函数。 + +避免直接保存ArkUI_NodeEvent对象指针,数据会在回调结束后销毁。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回错误码。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 用于添加组件事件回调函数的对象。 | +| eventReceiver | 组件事件回调函数。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)成功。 + +[ARKUI_ERROR_CODE_PARAM_INVALID](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)函数参数异常。 + +[ARKUI_ERROR_CODE_ON_INVALID_THREAD](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止在非UI线程调用函数操作已挂载到UI树上的节点。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); + +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +auto receiver = [](ArkUI_NodeEvent *event) {}; +multiThreadNodeApi->addNodeEventReceiver(node, receiver); +``` + + +### createNode + +``` +ArkUI_NodeHandle(* ArkUI_NativeNodeAPI_1::createNode) (ArkUI_NodeType type) +``` +**描述:** + +基于[ArkUI_NodeType](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodetype)生成对应的节点并返回节点对象指针。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| type | 创建指定类型的UI组件节点。 | + +**返回:** + +返回创建完成的节点操作指针,如果创建失败返回空指针。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); + +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +``` + +### disposeNode + +``` +void(* ArkUI_NativeNodeAPI_1::disposeNode) (ArkUI_NodeHandle node) +``` +**描述:** + +销毁节点指针指向的节点对象。 + +在非UI线程调用函数操作已挂载到UI树的节点时,函数调用不生效。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 组件节点对象。 | + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); + +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +multiThreadNodeApi->disposeNode(node); +``` + + +### getAttribute + +``` +const ArkUI_AttributeItem*(* ArkUI_NativeNodeAPI_1::getAttribute) (ArkUI_NodeHandle node, ArkUI_NodeAttributeType attribute) +``` +**描述:** + +属性获取函数。 + +该接口返回的指针是ArkUI框架内部的缓冲区指针,不需要开发者主动调用delete释放内存,但是需要在该函数下一次被调用前使用,否则可能会被其他值所覆盖。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回空指针。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 需要获取属性的节点对象。 | +| attribute | 需要获取的属性类型。 | + +**返回:** + +当前属性类型的属性值,失败返回空指针。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回空指针。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); + +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +auto attributeItem = multiThreadNodeApi->getAttribute(node, NODE_WIDTH); +``` + +### getChildAt + +``` +ArkUI_NodeHandle(* ArkUI_NativeNodeAPI_1::getChildAt) (ArkUI_NodeHandle node, int32_t position) +``` +**描述:** + +获取子节点。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回空指针。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 目标节点对象。 | +| position | 子节点的位置。 | + +**返回:** + +返回子节点的指针,如果没有返回空指针。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回空指针。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +auto node2 = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +multiThreadNodeApi->addChild(node, node2); + +auto child = multiThreadNodeApi->getChildAt(node, 0); +``` + +### getFirstChild + +``` +ArkUI_NodeHandle(* ArkUI_NativeNodeAPI_1::getFirstChild) (ArkUI_NodeHandle node) +``` +**描述:** + +获取第一个子节点。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回空指针。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 目标节点对象。 | + +**返回:** + +返回子节点的指针,如果没有返回空指针。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回空指针。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +auto node2 = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +multiThreadNodeApi->addChild(node, node2); + +auto child = multiThreadNodeApi->getFirstChild(node); +``` + +### getLastChild + +``` +ArkUI_NodeHandle(* ArkUI_NativeNodeAPI_1::getLastChild) (ArkUI_NodeHandle node) +``` +**描述:** + +获取最后一个子节点。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回空指针。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 目标节点对象。 | + +**返回:** + +返回子节点的指针,如果没有返回空指针。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回空指针。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +auto node2 = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +multiThreadNodeApi->addChild(node, node2); + +auto child = multiThreadNodeApi->getLastChild(node); +``` + +### getLayoutPosition + +``` +ArkUI_IntOffset(* ArkUI_NativeNodeAPI_1::getLayoutPosition) (ArkUI_NodeHandle node) +``` +**描述:** + +获取节点布局完成后的位置。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回ArkUI_IntOffset默认值{0, 0}。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 目标节点对象。 | + +**返回:** + +[ArkUI_IntOffset](../reference/apis-arkui/_ark_u_i___int_offset.md) 节点的位置。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回ArkUI_IntOffset默认值{0, 0}。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); + +auto layoutPosition = multiThreadNodeApi->getLayoutPosition(node); +``` + + +### getMeasuredSize + +``` +ArkUI_IntSize(* ArkUI_NativeNodeAPI_1::getMeasuredSize) (ArkUI_NodeHandle node) +``` +**描述:** + +获取节点测算完成后的宽高尺寸。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,接口返回ArkUI_IntSize默认值{0, 0}。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 目标节点对象。 | + +**返回:** + +[ArkUI_IntSize](../reference/apis-arkui/_ark_u_i___int_size.md) 节点的宽高。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,接口返回ArkUI_IntSize默认值{0, 0}。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); + +auto layoutPosition = multiThreadNodeApi->getMeasuredSize(node); +``` + +### getNextSibling + +``` +ArkUI_NodeHandle(* ArkUI_NativeNodeAPI_1::getNextSibling) (ArkUI_NodeHandle node) +``` +**描述:** + +获取下一个兄弟节点。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回空指针。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 目标节点对象。 | + +**返回:** + +返回节点的指针,如果没有返回空指针。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回空指针。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +auto node2 = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +auto node3 = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +multiThreadNodeApi->addChild(node, node2); +multiThreadNodeApi->addChild(node, node3); + +auto nextSibling = multiThreadNodeApi->getNextSibling(node2); +``` + + +### getParent + +``` +ArkUI_NodeHandle(* ArkUI_NativeNodeAPI_1::getParent) (ArkUI_NodeHandle node) +``` +**描述:** + +获取父节点。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回空指针。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 目标节点对象。 | + +**返回:** + +返回节点的指针,如果没有返回空指针。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回空指针。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +auto node2 = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +multiThreadNodeApi->addChild(node, node2); + +auto parent = multiThreadNodeApi->getNextSibling(node2); +``` + +### getPreviousSibling + +``` +ArkUI_NodeHandle(* ArkUI_NativeNodeAPI_1::getPreviousSibling) (ArkUI_NodeHandle node) +``` +**描述:** + +获取上一个兄弟节点。 + +在非UI线程调用函数操作已挂载到UI树上的node节点时,函数返回空指针。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 目标节点对象。 | + +**返回:** + +返回组件的指针,如果没有返回空指针。 + +在非UI线程调用函数操作已挂载到UI树上的node节点时,函数返回空指针。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +auto node2 = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +auto node3 = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +multiThreadNodeApi->addChild(node, node2); +multiThreadNodeApi->addChild(node, node3); + +auto previousSibling = multiThreadNodeApi->getPreviousSibling(node3); +``` + + +### getTotalChildCount + +``` +uint32_t(* ArkUI_NativeNodeAPI_1::getTotalChildCount) (ArkUI_NodeHandle node) +``` +**描述:** + +获取子节点的个数。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回0。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 目标节点对象。 | + +**返回:** + +子节点的个数, 如果没有返回0。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回0。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +auto node2 = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +multiThreadNodeApi->addChild(node, node2); + +auto count = multiThreadNodeApi->getTotalChildCount(node); +``` + + +### getUserData + +``` +void*(* ArkUI_NativeNodeAPI_1::getUserData) (ArkUI_NodeHandle node) +``` +**描述:** + +获取在节点上保存的自定义数据。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,接口返回空指针。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 保存了自定义数据的节点对象。 | + +**返回:** + +自定义数据。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,接口返回空指针。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +char* data = "user data"; +multiThreadNodeApi->setUserData(node, data); + +auto userData = multiThreadNodeApi->getUserData(node); +``` + + +### insertChildAfter + +``` +int32_t(* ArkUI_NativeNodeAPI_1::insertChildAfter) (ArkUI_NodeHandle parent, ArkUI_NodeHandle child, ArkUI_NodeHandle sibling) +``` +**描述:** + +将节点挂载到某个父节点之下,挂载位置在sibling节点之后。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回错误码。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| parent | 父节点指针。 | +| child | 子节点指针。 | +| sibling | 前一个兄弟节点指针,如果为空则插入位置在最后面。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)成功。 + +[ARKUI_ERROR_CODE_PARAM_INVALID](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)函数参数异常。 + +[ARKUI_ERROR_CODE_NOT_SUPPORTED_FOR_ARKTS_NODE](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止对BuilderNode生成的节点,进行设置属性、重置属性、设置事件与新增或修改子节点操作。 + +[ARKUI_ERROR_CODE_ON_INVALID_THREAD](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止在非UI线程调用函数操作已挂载到UI树上的节点。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +auto node2 = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +multiThreadNodeApi->addChild(node, node2); + +auto child = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +multiThreadNodeApi->insertChildAfter(node, child, node2); +``` + + +### insertChildAt + +``` +int32_t(* ArkUI_NativeNodeAPI_1::insertChildAt) (ArkUI_NodeHandle parent, ArkUI_NodeHandle child, int32_t position) +``` +**描述:** + +将节点挂载到某个父节点之下,挂载位置由position指定。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回错误码。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| parent | 父节点指针。 | +| child | 子节点指针。 | +| position | 插入位置,如果插入位置为负数或者不存在,则默认插入位置在最后面。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)成功。 + +[ARKUI_ERROR_CODE_PARAM_INVALID](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)函数参数异常。 + +[ARKUI_ERROR_CODE_NOT_SUPPORTED_FOR_ARKTS_NODE](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止对BuilderNode生成的节点, 进行设置属性、重置属性、设置事件与新增或修改子节点操作。 + +[ARKUI_ERROR_CODE_ON_INVALID_THREAD](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止在非UI线程调用函数操作已挂载到UI树上的节点。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); + +auto child = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +multiThreadNodeApi->insertChildAt(node, child, 0); +``` + +### insertChildBefore + +``` +int32_t(* ArkUI_NativeNodeAPI_1::insertChildBefore) (ArkUI_NodeHandle parent, ArkUI_NodeHandle child, ArkUI_NodeHandle sibling) +``` +**描述:** + +将节点挂载到某个父节点之下,挂载位置在sibling节点之前。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回错误码。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| parent | 父节点指针。 | +| child | 子节点指针。 | +| sibling | 后一个兄弟节点指针,如果为空则插入位置在最后面。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)成功。 + +[ARKUI_ERROR_CODE_PARAM_INVALID](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)函数参数异常。 + +[ARKUI_ERROR_CODE_NOT_SUPPORTED_FOR_ARKTS_NODE](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止对BuilderNode生成的节点, 进行设置属性、重置属性、设置事件与新增或修改子节点操作。 + +[ARKUI_ERROR_CODE_ON_INVALID_THREAD](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止在非UI线程调用函数操作已挂载到UI树上的节点。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +auto node2 = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +multiThreadNodeApi->addChild(node, node2); + +auto child = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +multiThreadNodeApi->insertChildBefore(node, child, node2); +``` + + +### layoutNode + +``` +int32_t(* ArkUI_NativeNodeAPI_1::layoutNode) (ArkUI_NodeHandle node, int32_t positionX, int32_t positionY) +``` +**描述:** + +对特定节点进行布局并传递该节点相对父节点的期望位置。 + +在非UI线程调用此函数返回错误码。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 目标节点对象。 | +| positionX | x轴坐标。 | +| positionY | y轴坐标。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)成功。 + +[ARKUI_ERROR_CODE_PARAM_INVALID](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)函数参数异常。 + +[ARKUI_ERROR_CODE_ON_INVALID_THREAD](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止在非UI线程调用函数。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); + +multiThreadNodeApi->layoutNode(node, 0, 0); +``` + +### markDirty + +``` +void(* ArkUI_NativeNodeAPI_1::markDirty) (ArkUI_NodeHandle node, ArkUI_NodeDirtyFlag dirtyFlag) +``` +**描述:** + +强制标记当前节点需要重新测算,布局或者绘制。 + +系统属性设置更新场景下ArkUI框架会自动标记脏区并重新执行测算,布局或者绘制,不需要开发者主动调用该函数。 + +在非UI线程调用此函数不生效。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 需要标记脏区的节点对象。 | +| dirtyFlag | 脏区类型。 | + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); + +multiThreadNodeApi->markDirty(node, NODE_NEED_MEASURE); +``` + +### measureNode + +``` +int32_t(* ArkUI_NativeNodeAPI_1::measureNode) (ArkUI_NodeHandle node, ArkUI_LayoutConstraint *Constraint) +``` +**描述:** + +对特定节点进行测算,可以通过getMeasuredSize接口获取测算后的大小。 + +在非UI线程调用此函数返回错误码。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 目标节点对象。 | +| Constraint | 约束尺寸。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)成功。 + +[ARKUI_ERROR_CODE_PARAM_INVALID](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)函数参数异常。 + +[ARKUI_ERROR_CODE_ON_INVALID_THREAD](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止在非UI线程调用函数。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); + +ArkUI_LayoutConstraint *constraint = nullptr; +multiThreadNodeApi->measureNode(node, constraint); +``` + +### registerNodeCustomEvent + +``` +int32_t(* ArkUI_NativeNodeAPI_1::registerNodeCustomEvent) (ArkUI_NodeHandle node, ArkUI_NodeCustomEventType eventType, int32_t targetId, void *userData) +``` +**描述:** + +注册自定义节点事件函数。事件触发时通过registerNodeCustomEventReceiver注册的自定义事件入口函数返回。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回错误码。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 需要注册事件的节点对象。 | +| eventType | 需要注册的事件类型。 | +| targetId | 自定义事件ID,当事件触发时在回调参数[ArkUI_NodeCustomEvent](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodecustomevent) 中携带回来。 | +| userData | 自定义事件参数,当事件触发时在回调参数[ArkUI_NodeCustomEvent](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodecustomevent) 中携带回来。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)成功。 + +[ARKUI_ERROR_CODE_PARAM_INVALID](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)函数参数异常。 + +[ARKUI_ERROR_CODE_ATTRIBUTE_OR_EVENT_NOT_SUPPORTED](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)系统中未找到Native接口的动态实现库。 + +[ARKUI_ERROR_CODE_ON_INVALID_THREAD](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止在非UI线程调用函数操作已挂载到UI树上的节点。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_CUSTOM); + +multiThreadNodeApi->registerNodeCustomEvent(node, ARKUI_NODE_CUSTOM_EVENT_ON_MEASURE, 0, nullptr); +``` + + +### registerNodeCustomEventReceiver + +``` +void(* ArkUI_NativeNodeAPI_1::registerNodeCustomEventReceiver) (void(*eventReceiver)(ArkUI_NodeCustomEvent *event)) +``` +**描述:** + +注册自定义节点事件回调统一入口函数。 + +ArkUI框架会统一收集过程中产生的自定义组件事件并通过注册的registerNodeCustomEventReceiver函数回调给开发者。 + +重复调用时会覆盖前一次注册的函数。 + +避免直接保存ArkUI_NodeCustomEvent对象指针,数据会在回调结束后销毁。 + +如果需要和组件实例绑定,可以使用addNodeCustomEventReceiver函数接口。 + +在非UI线程调用此函数不生效。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| eventReceiver | 事件回调统一入口函数。 | + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); + +auto receiver = [](ArkUI_NodeCustomEvent *event){}; +multiThreadNodeApi->registerNodeCustomEventReceiver(receiver); +``` + + +### registerNodeEvent + +``` +int32_t(* ArkUI_NativeNodeAPI_1::registerNodeEvent) (ArkUI_NodeHandle node, ArkUI_NodeEventType eventType, int32_t targetId, void *userData) +``` +**描述:** + +注册节点事件函数。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回错误码。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 需要注册事件的节点对象。 | +| eventType | 需要注册的事件类型。 | +| targetId | 自定义事件ID,当事件触发时在回调参数[ArkUI_NodeEvent](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodeevent-12) 中携带回来。 | +| userData | 自定义事件参数,当事件触发时在回调参数[ArkUI_NodeEvent](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_nodeevent-12) 中携带回来。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)成功。 + +[ARKUI_ERROR_CODE_PARAM_INVALID](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)函数参数异常。 + +[ARKUI_ERROR_CODE_ATTRIBUTE_OR_EVENT_NOT_SUPPORTED](../reference/apis-arkui/_ark_u_i___native_module. +md#arkui_errorcode)系统中未找到Native接口的动态实现库。 + +[ARKUI_ERROR_CODE_NOT_SUPPORTED_FOR_ARKTS_NODE](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止对BuilderNode生成的节点, 进行设置属性、重置属性、设置事件与新增或修改子节点操作。 + +[ARKUI_ERROR_CODE_ON_INVALID_THREAD](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止在非UI线程操作已挂载到UI树上的节点。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); + +multiThreadNodeApi->registerNodeEvent(node, NODE_TOUCH_EVENT, 0, nullptr); +``` + +### registerNodeEventReceiver + +``` +void(* ArkUI_NativeNodeAPI_1::registerNodeEventReceiver) (void(*eventReceiver)(ArkUI_NodeEvent *event)) +``` +**描述:** + +注册事件回调统一入口函数。 + +ArkUI框架会统一收集过程中产生的组件事件并通过注册的eventReceiver函数回调给开发者。 + +重复调用时会覆盖前一次注册的函数。 + +避免直接保存ArkUI_NodeEvent对象指针,数据会在回调结束后销毁。 + +如果需要和组件实例绑定,可以使用addNodeEventReceiver函数接口。 + +在非UI线程调用此函数不生效。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| eventReceiver | 事件回调统一入口函数。 | + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); + +auto receiver = [](ArkUI_NodeEvent *event){}; +multiThreadNodeApi->registerNodeEventReceiver(receiver); +``` + +### removeAllChildren + +``` +int32_t(* ArkUI_NativeNodeAPI_1::removeAllChildren) (ArkUI_NodeHandle parent) +``` +**描述:** + +从目标节点上移除所有子节点。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回错误码。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| parent | 目标节点对象。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)成功。 + +[ARKUI_ERROR_CODE_PARAM_INVALID](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)函数参数异常。 + +[ARKUI_ERROR_CODE_ON_INVALID_THREAD](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止在非UI线程调用函数操作已挂载到UI树上的节点。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +auto node2 = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +multiThreadNodeApi->addChild(node, node2); + +multiThreadNodeApi->removeAllChildren(node); +``` + +### unregisterNodeCustomEventReceiver + +``` +void(* ArkUI_NativeNodeAPI_1::unregisterNodeCustomEventReceiver) () +``` +**描述:** + +解注册节点自定义事件回调统一入口函数。 + +在非UI线程调用函数不生效。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto receiver = [](ArkUI_NodeCustomEvent *event){}; +multiThreadNodeApi->registerNodeCustomEventReceiver(receiver); + +multiThreadNodeApi->unregisterNodeCustomEventReceiver(); +``` + + +### unregisterNodeEventReceiver + +``` +void(* ArkUI_NativeNodeAPI_1::unregisterNodeEventReceiver) () +``` +**描述:** + +解注册事件回调统一入口函数。 + +在非UI线程调用函数不生效。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto receiver = [](ArkUI_NodeEvent *event){}; +multiThreadNodeApi->registerNodeEventReceiver(receiver); + +multiThreadNodeApi->unregisterNodeEventReceiver(); +``` + +### removeChild + +``` +int32_t(* ArkUI_NativeNodeAPI_1::removeChild) (ArkUI_NodeHandle parent, ArkUI_NodeHandle child) +``` +**描述:** + +将节点从父节点中移除。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回错误码。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| parent | 父节点对象。 | +| child | 子节点对象。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)成功。 + +[ARKUI_ERROR_CODE_PARAM_INVALID](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)函数参数异常。 + +[ARKUI_ERROR_CODE_NOT_SUPPORTED_FOR_ARKTS_NODE](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止对BuilderNode生成的节点, 进行设置属性、重置属性、设置事件与新增或修改子节点操作。 + +[ARKUI_ERROR_CODE_ON_INVALID_THREAD](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止在非UI线程调用函数操作已挂载到UI树上的节点。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +auto node2 = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +multiThreadNodeApi->addChild(node, node2); + +multiThreadNodeApi->removeChild(node, node2); +``` + +### removeNodeCustomEventReceiver + +``` +int32_t(* ArkUI_NativeNodeAPI_1::removeNodeCustomEventReceiver) (ArkUI_NodeHandle node, void(*eventReceiver)(ArkUI_NodeCustomEvent *event)) +``` +**描述:** + +删除节点上注册的自定义事件回调函数。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回错误码。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 用于删除节点自定义事件回调函数的节点对象。 | +| eventReceiver | 待删除的节点自定义事件回调函数。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)成功。 + +[ARKUI_ERROR_CODE_PARAM_INVALID](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)函数参数异常。 + +[ARKUI_ERROR_CODE_ON_INVALID_THREAD](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止在非UI线程调用函数操作已挂载到UI树上的节点。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_CUSTOM); +auto receiver = [](ArkUI_NodeCustomEvent *event) {}; +multiThreadNodeApi->addNodeCustomEventReceiver(node, receiver); + +multiThreadNodeApi->removeNodeCustomEventReceiver(node, receiver); +``` + + +### removeNodeEventReceiver + +``` +int32_t(* ArkUI_NativeNodeAPI_1::removeNodeEventReceiver) (ArkUI_NodeHandle node, void(*eventReceiver)(ArkUI_NodeEvent *event)) +``` +**描述:** + +删除节点上注册的节点事件回调函数。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回错误码。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 用于删除节点事件回调函数的节点对象。 | +| eventReceiver | 待删除的节点事件回调函数。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)成功。 + +[ARKUI_ERROR_CODE_PARAM_INVALID](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)函数参数异常。 + +[ARKUI_ERROR_CODE_ON_INVALID_THREAD](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止在非UI线程调用函数操作已挂载到UI树上的节点。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +auto receiver = [](ArkUI_NodeEvent *event) {}; +multiThreadNodeApi->addNodeEventReceiver(node, receiver); + +multiThreadNodeApi->removeNodeEventReceiver(node, receiver); +``` + + +### resetAttribute + +``` +int32_t(* ArkUI_NativeNodeAPI_1::resetAttribute) (ArkUI_NodeHandle node, ArkUI_NodeAttributeType attribute) +``` +**描述:** + +重置属性函数。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回错误码。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 需要重置属性的节点对象。 | +| attribute | 需要重置的属性类型。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)成功。 + +[ARKUI_ERROR_CODE_PARAM_INVALID](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)函数参数异常。 + +[ARKUI_ERROR_CODE_ATTRIBUTE_OR_EVENT_NOT_SUPPORTED](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)系统中未找到Native接口的动态实现库。 +[ARKUI_ERROR_CODE_NOT_SUPPORTED_FOR_ARKTS_NODE](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止对BuilderNode生成的节点, 进行设置属性、重置属性、设置事件与新增或修改子节点操作。 + +[ARKUI_ERROR_CODE_ON_INVALID_THREAD](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止在非UI线程调用函数操作已挂载到UI树上的节点。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +ArkUI_NumberValue value[] = {{.f32 = 100}}; +ArkUI_AttributeItem item = {value, 1}; +multiThreadNodeApi->setAttribute(node, NODE_WIDTH, &item); + +auto attributeItem = multiThreadNodeApi->resetAttribute(node, NODE_WIDTH); +``` + + +### setAttribute + +``` +int32_t(* ArkUI_NativeNodeAPI_1::setAttribute) (ArkUI_NodeHandle node, ArkUI_NodeAttributeType attribute, const ArkUI_AttributeItem *item) +``` +**描述:** + +属性设置函数。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回错误码。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 需要设置属性的节点对象。 | +| attribute | 需要设置的属性类型。 | +| item | 需要设置的属性值。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)成功。 + +[ARKUI_ERROR_CODE_PARAM_INVALID](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)函数参数异常。 + +[ARKUI_ERROR_CODE_ATTRIBUTE_OR_EVENT_NOT_SUPPORTED](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)系统中未找到Native接口的动态实现库。 + +[ARKUI_ERROR_CODE_NOT_SUPPORTED_FOR_ARKTS_NODE](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止对BuilderNode生成的节点, 进行设置属性、重置属性、设置事件与新增或修改子节点操作。 + +[ARKUI_ERROR_CODE_ON_INVALID_THREAD](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止在非UI线程调用函数操作已挂载到UI树上的节点。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); + +ArkUI_NumberValue value[] = {{.f32 = 100}}; +ArkUI_AttributeItem item = {value, 1}; +multiThreadNodeApi->setAttribute(node, NODE_WIDTH, &item); +``` + +### setLayoutPosition + +``` +int32_t(* ArkUI_NativeNodeAPI_1::setLayoutPosition) (ArkUI_NodeHandle node, int32_t positionX, int32_t positionY) +``` +**描述:** + +在布局回调函数中设置节点的位置。 + +在非UI线程调用函数返回错误码。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 目标节点对象。 | +| positionX | x轴坐标。 | +| positionY | y轴坐标。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)成功。 + +[ARKUI_ERROR_CODE_PARAM_INVALID](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)函数参数异常。 + +[ARKUI_ERROR_CODE_ON_INVALID_THREAD](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止在非UI线程调用函数。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); + +multiThreadNodeApi->setLayoutPosition(node, 0, 0); +``` + +### setLengthMetricUnit + +``` +int32_t(* ArkUI_NativeNodeAPI_1::setLengthMetricUnit) (ArkUI_NodeHandle node, ArkUI_LengthMetricUnit unit) +``` +**描述:** + +指定节点的单位。 + +在非UI线程调用函数返回错误码。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 用于指定单位的节点。 | +| unit | 单位类型[ArkUI_LengthMetricUnit](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_lengthmetricunit),默认为 ARKUI_LENGTH_METRIC_UNIT_DEFAULT。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)成功。 + +[ARKUI_ERROR_CODE_PARAM_INVALID](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)函数参数异常。 + +[ARKUI_ERROR_CODE_ON_INVALID_THREAD](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止在非UI线程调用函数操作已挂载到UI树上的节点。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); + +multiThreadNodeApi->setLengthMetricUnit(node, ARKUI_LENGTH_METRIC_UNIT_VP); +``` + +### setMeasuredSize + +``` +int32_t(* ArkUI_NativeNodeAPI_1::setMeasuredSize) (ArkUI_NodeHandle node, int32_t width, int32_t height) +``` +**描述:** + +在测算回调函数中设置节点测算完成后的宽和高。 + +在非UI线程调用函数返回错误码。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 目标节点对象。 | +| width | 设置的宽。 | +| height | 设置的高。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)成功。 + +[ARKUI_ERROR_CODE_PARAM_INVALID](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)函数参数异常。 + +[ARKUI_ERROR_CODE_ON_INVALID_THREAD](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止在非UI线程调用此函数。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); + +multiThreadNodeApi->setMeasuredSize(node, 100, 100); +``` + +### setUserData + +``` +int32_t(* ArkUI_NativeNodeAPI_1::setUserData) (ArkUI_NodeHandle node, void *userData) +``` +**描述:** + +在节点上保存自定义数据。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数返回错误码。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 用于保存自定义数据的节点。 | +| userData | 要保存的自定义数据。 | + +**返回:** + +[ARKUI_ERROR_CODE_NO_ERROR](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)成功。 + +[ARKUI_ERROR_CODE_PARAM_INVALID](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)函数参数异常。 + +[ARKUI_ERROR_CODE_ON_INVALID_THREAD](../reference/apis-arkui/_ark_u_i___native_module.md#arkui_errorcode)禁止在非UI线程调用函数操作已挂载到UI树上的节点。 + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); + +char* data = "user data"; +multiThreadNodeApi->setUserData(node, data); +``` + +### unregisterNodeCustomEvent + +``` +void(* ArkUI_NativeNodeAPI_1::unregisterNodeCustomEvent) (ArkUI_NodeHandle node, ArkUI_NodeCustomEventType eventType) +``` +**描述:** + +解注册节点自定义事件函数。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数不生效。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 需要解注册事件的节点对象。 | +| eventType | 需要解注册的事件类型。 | + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_CUSTOM); +multiThreadNodeApi->registerNodeCustomEvent(node, ARKUI_NODE_CUSTOM_EVENT_ON_MEASURE, 0, nullptr); + +multiThreadNodeApi->unregisterNodeCustomEvent(node, ARKUI_NODE_CUSTOM_EVENT_ON_MEASURE); +``` + +### unregisterNodeEvent + +``` +void(* ArkUI_NativeNodeAPI_1::unregisterNodeEvent) (ArkUI_NodeHandle node, ArkUI_NodeEventType eventType) +``` +**描述:** + +解注册节点事件函数。 + +在非UI线程调用函数操作已挂载到UI树上的节点时,函数不生效。 + +**参数:** + +| 名称 | 描述 | +| -------- | -------- | +| node | 需要解注册事件的节点对象。 | +| eventType | 需要解注册的事件类型。 | + +**示例:** +``` +ArkUI_NativeNodeAPI_1 *multiThreadNodeApi = nullptr; +OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeApi); +auto node = multiThreadNodeApi->createNode(ARKUI_NODE_STACK); +multiThreadNodeApi->registerNodeEvent(node, NODE_TOUCH_EVENT, 0, nullptr); + +multiThreadNodeApi->unregisterNodeEvent(node, NODE_TOUCH_EVENT); +``` \ No newline at end of file diff --git a/zh-cn/application-dev/ui/ndk-build-on-multi-thread.md b/zh-cn/application-dev/ui/ndk-build-on-multi-thread.md new file mode 100644 index 00000000000..3e4d70e5fbd --- /dev/null +++ b/zh-cn/application-dev/ui/ndk-build-on-multi-thread.md @@ -0,0 +1,352 @@ +# NDK支持多线程创建组件 +在多线程环境中使用NKD创建UI组件的开发指南 + +## 概述 + +在旧版NDK中,组件的创建与初始化必须在应用程序主线程中执行。这导致开发者在集成时,需要将任务切换回主线程,不仅增加调用代码的复杂度,也限制了组件构造过程的灵活性与性能。 + +随着用户界面日益复杂,页面中可能同时存在大量动态生成的UI组件,这类任务堆积在单一主线程中执行,通常导致启动缓慢、动画掉帧以及界面卡顿,直接影响用户体验。 + +针对这些问题,**新版API引入了完整的多线程支持**,为开发者带来了以下实质性提升: + +- **彻底简化调用流程** 开发者无需手动切换线程或通过任务队列将组件创建任务转回主线程,可以在自己的框架线程中直接调用组件创建接口,减少上下文切换与潜在的竞态问题,简化框架与应用之间的交互逻辑。 + +- **性能与体验大幅优化** 多线程能力允许组件创建与初始化任务并行执行,能充分利用设备多核CPU,在页面启动与界面构造阶段减少总体耗时。主线程则专注动画渲染与用户输入,确保界面流畅与交互及时。 + +- **为未来拓展奠定坚实基础** 多线程支持不仅解决当前性能瓶颈,还为未来引入复杂、高负载的界面组件提供可扩展空间,帮助开发者在设计时拥有更大的灵活度与掌控力,为持续提升用户体验创造条件。 + +通过这次升级,开发者能专注于自身逻辑实现,无需关注并发与线程切换等底层细节。在更大的任务量与复杂场景下,开发者将获得更加可预测、高性能的界面创建体验。 + +## 使用场景 + +- 调用 `OH_ArkUI_GetModuleInterface`,入参传入 `ARKUI_MULTI_THREAD_NATIVE_NODE` 获取支持多线程调用的NDK接口集合。例如: + + ```cpp + ArkUI_NativeNodeAPI_1 *multiThreadNodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, multiThreadNodeAPI); + ``` + + 多线程接口详情请参考[多线程NDK接口说明](./ndk-build-on-multi-thread-api.md)。 + +- 使用[OH_ArkUI_PostAsyncUITask](../reference/apis-arkui/_ark_u_i___native_module.md#oh_arkui_postasyncuitask)接口将任务调度到系统线程池中执行. + +- 当开发者需要在自己维护的非UI线程中创建UI组件时,使用[OH_ArkUI_PostUITask](../reference/apis-arkui/_ark_u_i___native_module.md#oh_arkui_postuitask)接口将组件挂载到UI树的任务提交到UI线程执行。 + +- 另提供[OH_ArkUI_PostUITaskAndWait](../reference/apis-arkui/_ark_u_i___native_module.md#oh_arkui_postuitaskandwait)接口将组件挂载到UI树的任务提交到UI线程执行后,此时调用线程阻塞等待UI线程任务结束。此接口可能导致接口调用线程长时间阻塞,不推荐频繁使用。 + +## 调用规范与线程安全 + +- 多线程接口规范请参考[多线程NDK接口说明](./ndk-build-on-multi-thread-api.md)。调用接口时必须检查返回值,如果在非UI线程中调用不支持的接口,将返回错误码。 + +- 尽管我们提供了线程安全的组件创建与属性设置接口,单个组件内部仍然不是线程安全的。请避免在多个线程中同时操作同一组件或同一颗组建树,否则可能出现不可预测的结果。 + +- 多线程接口中,组件有以下两种状态: + + - **Free(游离状态):** 组件未挂载到主树,不参与UI流水线,属性可安全更新。 + - **Attached(已挂载状态):** 组件已挂载,交由UI流水线管理,属性更新必须在UI线程中调用,否则将返回错误码。 + +## 示例 + +以下是接口使用示例。为简化编程和工程管理,在开始编写并行化组件创建代码前,请先参考[接入ArkTS页面](ndk-access-the-arkts-page.md)指导文档,在native侧使用面向对象的方式对将ArkUI_NodeHandle封装为ArkUINode对象。 + +```ts +// index.ets +import { NodeContent } from '@kit.ArkUI'; +import entry from 'libentry.so'; + +@Component +struct CAPIComponent { + private rootSlot = new NodeContent(); + + aboutToAppear(): void { + // 调用Native接口进行组件创建 + entry.CreateNodeTreeOnMultiThread(this.rootSlot, this.getUIContext()); + } + + aboutToDisappear(): void { + // 释放已创建的Native组件 + entry.DisposeNodeTreeOnMultiThread(this.rootSlot); + } + + build() { + Column() { + // Native组件挂载点 + ContentSlot(this.rootSlot) + } + } +} + +@Entry +@Component +struct Index { + @State isShow: boolean = false; + @State message: string = "CreateNodeTree"; + + build() { + Flex() { + Column() { + Text('CreateNodeTreeOnMultiThread') + .fontSize(18) + .fontWeight(FontWeight.Bold) + Button(this.message) + .onClick(() => { + this.isShow = !this.isShow; + if (this.isShow) { + this.message = "DisposeNodeTree" + } else { + this.message = "CreateNodeTree" + } + }) + if (this.isShow) { + CAPIComponent() + } + } + } + } +} + +``` + +```cpp +// NativeModule.h +#ifndef MYAPPLICATION_NATIVEMODULE_H +#define MYAPPLICATION_NATIVEMODULE_H + +#include +#include +#include + +namespace NativeModule { + +class NativeModuleInstance { +public: + static NativeModuleInstance *GetInstance() { + static NativeModuleInstance instance; + return &instance; + } + + NativeModuleInstance() { + // 获取多线程NDK接口的函数指针结构体对象,用于后续操作。 + OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, arkUINativeNodeApi_); + assert(arkUINativeNodeApi_); + } + // 暴露给其他模块使用。 + ArkUI_NativeNodeAPI_1 *GetNativeNodeAPI() { return arkUINativeNodeApi_; } + +private: + ArkUI_NativeNodeAPI_1 *arkUINativeNodeApi_ = nullptr; +}; +} // namespace NativeModule + +#endif // MYAPPLICATION_NATIVEMODULE_H +``` + +```cpp +// CreateNode.h +#ifndef MYAPPLICATION_CREATENODE_H +#define MYAPPLICATION_CREATENODE_H + +#include "common/ArkUINode.h" + +#include + +namespace NativeModule { +class ArkUIButtonNode: public ArkUINode { +public: + ArkUIButtonNode() : + ArkUINode(NativeModuleInstance::GetInstance()->GetNativeNodeAPI()->createNode(ARKUI_NODE_BUTTON)) {} + int32_t SetLabel(ArkUI_AttributeItem& label_item) { + return nativeModule_->setAttribute(handle_, NODE_BUTTON_LABEL, &label_item); + } +}; + +class ArkUIRowNode: public ArkUINode { +public: + ArkUIRowNode() : + ArkUINode(NativeModuleInstance::GetInstance()->GetNativeNodeAPI()->createNode(ARKUI_NODE_ROW)) {} +}; + +class ArkUIScrollNode: public ArkUINode { +public: + ArkUIScrollNode() : + ArkUINode(NativeModuleInstance::GetInstance()->GetNativeNodeAPI()->createNode(ARKUI_NODE_SCROLL)) {} +}; + +class ArkUIColumnNode: public ArkUINode { +public: + ArkUIColumnNode() : + ArkUINode(NativeModuleInstance::GetInstance()->GetNativeNodeAPI()->createNode(ARKUI_NODE_COLUMN)) {} +}; + +napi_value DisposeNodeTreeOnMultiThread(napi_env env, napi_callback_info info); +napi_value CreateNodeTreeOnMultiThread(napi_env env, napi_callback_info info); +} // namespace NativeModule + +#endif //MYAPPLICATION_CREATENODE_H +``` + + +```cpp +// CreateNode.cpp +#include "node/CreateNode.h" + +#include +#include +#include +#include + +namespace NativeModule { +#define CHILD_NODE_TREE_NUMBER 10 //多线程创建组件树的数量 +struct AsyncData { + napi_env env; + std::shared_ptr parent = nullptr; + std::shared_ptr child = nullptr; +}; + +// 保存ArkTs侧NodeContent指针与Native侧节点树根节点的对应关系。 +std::map> g_nodeMap; + +//多线程创建组件 +void CreateNodeTree(void *asyncUITaskData) { + auto asyncData = static_cast(asyncUITaskData); + if (!asyncData) { + return; + } + auto rowNode = std::make_shared(); + asyncData->child = rowNode; + + auto buttonNode1 = std::make_shared(); + ArkUI_AttributeItem label_item = { .string = "button1" }; + int32_t result = buttonNode1->SetLabel(label_item); + if (result != ARKUI_ERROR_CODE_NO_ERROR) { + OH_LOG_ERROR(LOG_APP, "Button SetLabel Failed %{public}d", result); + } + + auto buttonNode2 = std::make_shared(); + ArkUI_AttributeItem label_item2 = { .string = "button2" }; + result = buttonNode2->SetLabel(label_item2); + if (result != ARKUI_ERROR_CODE_NO_ERROR) { + OH_LOG_ERROR(LOG_APP, "Button SetLabel Failed %{public}d", result); + } + + rowNode->AddChild(buttonNode1); + rowNode->AddChild(buttonNode2); +} + +// 组件多线程创建完成后,回到UI线程挂载到UI树上 +void MountNodeTree(void *asyncUITaskData) { + auto asyncData = static_cast(asyncUITaskData); + if (!asyncData) { + return; + } + auto parent = asyncData->parent; + auto child = asyncData->child; + parent->AddChild(child); + delete asyncData; +} + +napi_value CreateNodeTreeOnMultiThread(napi_env env, napi_callback_info info) { + size_t argc = 2; + napi_value args[2] = { nullptr, nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + + ArkUI_NodeContentHandle contentHandle; + int32_t result = OH_ArkUI_GetNodeContentFromNapiValue(env, args[0], &contentHandle); + if (result != ARKUI_ERROR_CODE_NO_ERROR) { + OH_LOG_ERROR(LOG_APP, "OH_ArkUI_GetNodeContentFromNapiValue Failed %{public}d", result); + return nullptr; + } + ArkUI_ContextHandle contextHandle; + result = OH_ArkUI_GetContextFromNapiValue(env, args[1], &contextHandle); + if (result != ARKUI_ERROR_CODE_NO_ERROR) { + OH_LOG_ERROR(LOG_APP, "OH_ArkUI_GetContextFromNapiValue Failed %{public}d", result); + return nullptr; + } + + auto scrollNode = std::make_shared(); + result = OH_ArkUI_NodeContent_AddNode(contentHandle, scrollNode->GetHandle()); + if (result != ARKUI_ERROR_CODE_NO_ERROR) { + OH_LOG_ERROR(LOG_APP, "OH_ArkUI_NodeContent_AddNode Failed %{public}d", result); + return nullptr; + } + g_nodeMap[contentHandle] = scrollNode; + + auto columnNode = std::make_shared(); + scrollNode->AddChild(columnNode); + for (int i = 0; i < CHILD_NODE_TREE_NUMBER; i++) { + //UI线程创建子树根节点,保证scroll的子节点顺序 + auto columnItem = std::make_shared(); + columnNode->AddChild(columnItem); + AsyncData* asyncData = new AsyncData(); + asyncData->parent = columnItem; + // 在非UI线程创建组件树,创建完成后回到主线程挂载到主树上 + result = OH_ArkUI_PostAsyncUITask(contextHandle, asyncData, CreateNodeTree, MountNodeTree); + if (result != ARKUI_ERROR_CODE_NO_ERROR) { + OH_LOG_ERROR(LOG_APP, "OH_ArkUI_PostAsyncUITask Failed %{public}d", result); + delete asyncData; + } + } + return nullptr; +} + +napi_value DisposeNodeTreeOnMultiThread(napi_env env, napi_callback_info info) +{ + size_t argc = 1; + napi_value args[1] = { nullptr }; + napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); + + ArkUI_NodeContentHandle contentHandle; + int32_t result = OH_ArkUI_GetNodeContentFromNapiValue(env, args[0], &contentHandle); + if (result != ARKUI_ERROR_CODE_NO_ERROR) { + OH_LOG_ERROR(LOG_APP, "OH_ArkUI_GetNodeContentFromNapiValue Failed %{public}d", result); + return nullptr; + } + + auto it = g_nodeMap.find(contentHandle); + if (it == g_nodeMap.end()) { + return nullptr; + } + auto rootNode = it->second; + result = OH_ArkUI_NodeContent_RemoveNode(contentHandle, rootNode->GetHandle()); + if (result != ARKUI_ERROR_CODE_NO_ERROR) { + OH_LOG_ERROR(LOG_APP, "OH_ArkUI_NodeContent_RemoveNode Failed %{public}d", result); + return nullptr; + } + g_nodeMap.erase(contentHandle); + return nullptr; +} +} // namespace NativeModule +``` + + + + +## 错误与异常处理 + +- 在非UI线程中调用不支持多线程的接口将返回错误码。 +- 挂载到UI主树后,非UI线程调用组件接口将返回错误码。 +- 在Native节点下树前,必须先卸载嵌套的ArkTs节点,以避免在非UI线程中遍历节点树时访问ArkTS节点导致崩溃。 + +框架将打印如下日志提示: + +``` +CheckIsThreadSafeNodeTree failed. thread safe node tree contains unsafe node: ${nodeid} +``` + +## 迁移指南 + +1. 将原有接口集合 Tag 从 `ARKUI_NATIVE_NODE` 修改为 `ARKUI_MULTI_THREAD_NATIVE_NODE` 即可获得多线程能力,接口与参数保持一致: + + ```c + ArkUI_NativeNodeAPI_1 *nodeAPI = nullptr; + OH_ArkUI_GetModuleInterface(ARKUI_MULTI_THREAD_NATIVE_NODE, ArkUI_NativeNodeAPI_1, nodeAPI); + ``` + +2. 建议将原先在UI线程中执行的组件创建任务拆分成更细粒度任务,分派给不同工作线程执行,以减少主线程阻塞,提高页面启动与更新流畅度。 + +3. 预先在后台线程中创建常用组件树,为性能敏感场景提供更好的用户体验。 + +## 最佳实践 +通过以下的一个例子,我们将展示如何通过多线程的Native接口来实现并行化创建组建,最终提升用户体验。 + +[最佳实践源码地址](https://gitee.com/openharmony/applications_app_samples/tree/master/code/UI/NdkBuildOnMultiThread/README.md) \ No newline at end of file diff --git a/zh-cn/application-dev/website.md b/zh-cn/application-dev/website.md index 10d0cd48086..082852ba10b 100644 --- a/zh-cn/application-dev/website.md +++ b/zh-cn/application-dev/website.md @@ -606,6 +606,7 @@ - [查询和操作自定义节点](ui/ndk-node-query-operate.md) - [通过EmbeddedComponent拉起EmbeddedUIExtensionAbility](ui/ndk-embedded-component.md) - [在NDK中保证多实例场景功能正常](ui/ndk-scope-task.md) + - [NDK支持多线程创建组件](ui/ndk-build-on-multi-thread.md) - UI开发 (兼容JS的类Web开发范式) - [UI开发 (兼容JS的类Web开发范式)概述](ui/ui-js-overview.md) - 框架说明 -- Gitee