
鸿蒙原生应用元服务开发-仓颉ArkTS相互操作(二)
九、在 ArkTS 里操作仓颉对象
这里用例展示的是把仓颉对象分享到 ArkTS 运行时,使用 ArkTS 运行时的内存管理机制来控制仓颉对象的生命周期,并通过相关的互操作接口来访问该对象。
JSExternal 对象在 ArkTS 里的类型会被识别为 undefined,直接使用 undefined 来作为参数很容易被传递错误的参数会在运行时出错,如下示例:
十、把仓颉对象的引用挂在 JSObject 上传递到 ArkTS
在实际开发接口时,可以把 JSExternal 对象绑定到一个 JSObject 对象上,把 JSExternal 的数据隐藏起来,以此来提高接口的安全性。
下面通过一个例子来展示:
十一、为仓颉共享对象创建 JSClass
把所有的对象操作方法直接挂在对象上,一方面占用内存比较大,另一方面创建对象的开销比较大。对于追求性能的场景,可以定义一个 JSClass 来加速对象创建和减小内存占用。
十二、ArkTS 互操作和仓颉多线程
ArkTS 是单线程执行的虚拟机,在运行时上没有对并发做任何的容错;而仓颉在语法上支持内存共享的多线程。
如果在互操作的场景不加限制的使用多线程,可能会导致无法预期的错误,因此需要一些规范和指引来保证程序正常执行:
ArkTS 代码以及大部分互操作接口只能在 ArkTS 线程上执行,否则会抛出仓颉异常。
在进入其他线程前,需要把所有依赖的 ArkTS 数据转换为仓颉数据。
在其他线程如果想要使用 ArkTS 接口,需要通过 context.postJSTask 切换到 ArkTS 线程来执行。
下面通过一个用例来展示具体做法,该用例是互操作函数,该函数的功能是对两个数字相加,并调用回调来返回相加数。
在 ArkTS 存在着 Promise,这是对回调机制的一种封装,配合 async 、 await 的语法让回调机制变成同步调用的形式。对于上一个用例,使用 Promise 的形式来定义接口和访问:
资料来源:HarmonyOS Developer 官方网站
