【HarmonyOS Next】鸿蒙应用进程和线程详解

GeorgeGcs
• 阅读 4

##鸿蒙开发能力 ##HarmonyOS SDK应用服务##鸿蒙金融类应用 (金融理财# 一、前言

  1. 进程的定义: 进程是系统进行资源分配的基本单位,是操作系统结构的基础。 在鸿蒙系统中,一个应用下会有三类进程: (1) 主进程, (2) ExtensionAbility进程,同一种类型的ExtensionAbility会放在一个进程里。例如FromExtensionAbility,创建了两个,也会在同一个进程里。【ExtensionAbility详情参见官方链接:ExtensionAbility组件】 (3) WebView渲染进程,用于网页容器渲染的进程。【这种设计提升了鸿蒙系统中arkWeb的网页容器渲染能力】

  2. 线程的定义: 线程是操作系统进行运算调度的基本单位,是进程中的执行流,共享进程的资源。 鸿蒙系统中,以主进程举例,会有三种类型的线程: (1)主线程 (2)TaskPool Worker线程 (3)Worker线程 后两者用于创建多线程,TaskPool Worker主要用于处理轻量级的耗时任务。Worker用于偏重的耗时任务。 二、进程处理:

  3. 进程的创建: 如上图所示,三方应用可以创建XXExtensionAbility的形式,增加应用内的进程。但是Webview渲染进程和主进程的是不能创建增加。

  4. 跨进程通信: 鸿蒙系统目前提供了两种方式实现跨进程通信,公共事件和Emitter。这两个方案外,startAbility也可传递一些信息。 公共事件主要是监听系统的事件,分为系统公共事件和自定义事件。三方应用主要通过自定义事件来通信。 import { commonEventManager } from '@kit.BasicServicesKit'; import { BusinessError } from '@kit.BasicServicesKit';

// 定义订阅者,用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作 let subscriber: commonEventManager.CommonEventSubscriber; // 订阅者信息 let subscribeInfo: commonEventManager.CommonEventSubscribeInfo = { events: ["event"] }; // 创建订阅者回调 function createCB(err: BusinessError, commonEventSubscriber: commonEventManager.CommonEventSubscriber) { if (err != null) { console.error(Failed to create subscriber. Code is ${err.code}, message is ${err.message}); } else { console.info(Succeeded in creating subscriber); subscriber = commonEventSubscriber; } } // 创建订阅者 commonEventManager.createSubscriber(subscribeInfo, createCB); Emitter的使用类似于EventHub,只不过在这个基础上,多了传递包裹的封装,添加了优先级和序号。也新增了once,监听一次的接口而已。 @Sendable class Sample { constructor() { this.count = 100; } printCount() { console.info('Print count : ' + this.count); } count: number; }

let callback = (eventData: emitter.GenericEventData): void => { let storage: Sample = eventData.data!; storage.printCount(); } // 收到eventId为"eventId"的事件后执行回调函数 emitter.on("eventId", callback); 三、线程处理:

1.线程的创建和线程间通信: 如上所说,可以使用TaskPool Worker 和 Worker创建线程。并且配套会有双向通信的接口。 需要注意的是前者有性能要求,太过于耗时的操作,例如超过三分钟,就会无条件失败,这种耗时任务就要使用后者Worker来实现。不过后者又因为消耗系统资源,一个应用只能创建八个。 TaskPool Worker: @Concurrent function printArgs(args: number): number { console.info("printArgs: " + args); return args; }

taskpool.execute(printArgs, 100).then((value: Object) => { // 100: test number console.info("taskpool result: " + value); }); Worker: // Worker.ets import { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';

// 创建worker线程中与宿主线程通信的对象 const workerPort = worker.workerPort

// worker线程接收宿主线程信息 workerPort.onmessage = (e: MessageEvents): void => { // data:宿主线程发送的信息 let data: number = e.data; // 往收到的buffer里写入数据 const view = new Int8Array(data).fill(3); // worker线程向宿主线程发送信息 workerPort.postMessage(view); }

// worker线程发生error的回调 workerPort.onerror = (err: ErrorEvent) => { console.log("worker.ets onerror" + err.message); }

// Index.ets import { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';

@Entry @Component struct Index { @State message: string = 'Hello World';

build() { Row() { Column() { Text(this.message) .fontSize(50) .fontWeight(FontWeight.Bold) .onClick(() => { // 宿主线程中创建Worker对象 const workerInstance = new worker.ThreadWorker("entry/ets/workers/Worker.ets"); // 宿主线程向worker线程传递信息 const buffer = new ArrayBuffer(8); workerInstance.postMessage(buffer, [buffer]); // 宿主线程接收worker线程信息 workerInstance.onmessage = (e: MessageEvents): void => { // data:worker线程发送的信息 let data: number = e.data; console.info("main thread data is " + data); // 销毁Worker对象 workerInstance.terminate(); } // 在调用terminate后,执行onexit workerInstance.onexit = (code) => { console.log("main thread terminate"); }

        workerInstance.onerror = (err: ErrorEvent) => {
          console.log("main error message " + err.message);
        }
      })
  }
  .width('100%')
  .height('100%')
}

} } 2.线程内通信: EventHub,GlobalThis,单例,AppStorage。都可实现线程内UI界面,UIAbility和业务类之间的通信。

点赞
收藏
评论区
推荐文章
GeorgeGcs GeorgeGcs
18小时前
【 HarmonyOS 5 入门系列 】鸿蒙HarmonyOS示例项目讲解
【HarmonyOS5入门系列】鸿蒙HarmonyOS示例项目讲解\鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言:移动开发声明式UI框架的技术变革在移动操作系统的发展历程中,UI开发模式经历了从命令式到声明式的重大变革。根据
GeorgeGcs GeorgeGcs
18小时前
【HarmonyOS 5】AttributeModifier和AttributeUpdater区别详解
【HarmonyOS5】AttributeModifier和AttributeUpdater区别详解\鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、AttributeModifier和AttributeUpdater的定义和作用1
GeorgeGcs GeorgeGcs
12小时前
从“备胎”到领航者,鸿蒙操作系统的传奇进化
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财【HarmonyOS5】2019年,在全球科技产业的风云变幻中,华为正式推出了鸿蒙操作系统(HarmonyOS),这一消息如同一颗重磅炸弹,瞬间吸引了全世界的目光。彼时,外界对鸿蒙的诞生背
GeorgeGcs GeorgeGcs
10小时前
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言在HarmonyOS5的应用开发模型中,featureAbility是旧版FA模型(FeatureAbility)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文
GeorgeGcs GeorgeGcs
10小时前
【HarmonyOS 5】金融应用开发鸿蒙组件实践
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、鸿蒙生态观察2024年1月18日:发布原生鸿蒙操作系统星河版,面向开发者开放申请,余承东宣布鸿蒙生态设备数达8亿台;建设银行、邮储银行等完成鸿蒙原生应用Beta版本开发。2024年10
GeorgeGcs GeorgeGcs
10小时前
【HarmonyOS 5】鸿蒙应用代码控制横竖屏切换,自动切换横竖屏,监听横竖屏以及注意事项
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、鸿蒙应用如何进行页面横竖屏调用API手动切换1.首先要在EntryAbility中获取主窗口对象EntryAbility.etsimportAbilityConstant,UIAbil
GeorgeGcs GeorgeGcs
10小时前
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言在HarmonyOS5的应用开发模型中,featureAbility是旧版FA模型(FeatureAbility)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文
GeorgeGcs GeorgeGcs
10小时前
【HarmonyOS 5】鸿蒙组件&模板服务详解 - 助力高效开发的利器
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、前言在移动应用开发领域,效率与质量始终是开发者追求的核心目标。鸿蒙系统作为新兴的操作系统,为开发者提供了丰富且强大的开发资源,其中鸿蒙组件&模板服务更是成为开发者快速构建高质量应用的得
GeorgeGcs GeorgeGcs
8小时前
【HarmonyOS 5】如何开启DevEco Studio热更新调试应用模式
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、AttributeModifier和AttributeUpdater的定义和作用1.AttributeModifier是ArkUI组件的动态属性,提供属性设置功能。开发者可使用attr
GeorgeGcs GeorgeGcs
8小时前
【HarmonyOS 5】鸿蒙发展历程
鸿蒙开发能力HarmonyOSSDK应用服务鸿蒙金融类应用(金融理财一、鸿蒙HarmonyOS版本年代记鸿蒙1.0:2019年8月9日,华为在开发者大会上正式发布鸿蒙1.0系统,这一版本首次应用于华为荣耀智慧屏产品中,标志着华为正式进军操作系统领域。该版本
GeorgeGcs
GeorgeGcs
Lv1
男 · 金融头部企业 · 鸿蒙应用架构师
HarmonyOS认证创作先锋,华为HDE专家,鸿蒙讲师,作者。目前任职鸿蒙应用架构师。 历经腾讯,宝马,研究所,金融。 待过私企,外企,央企。 深耕大应用开发领域十年。 AAE,Harmony(OpenHarmony\HarmonyOS),MAE(Android\IOS),FE(H5\Vue\RN)。
文章
56
粉丝
1
获赞
2