1# 使用Emitter进行线程间通信 2 3<!--Kit: Basic Services Kit--> 4<!--Subsystem: Notification--> 5<!--Owner: @peixu--> 6<!--Designer: @dongqingran; @wulong158--> 7<!--Tester: @wanghong1997--> 8<!--Adviser: @huipeizi--> 9 10Emitter是一种作用在进程内的事件处理机制,为应用程序提供订阅事件、发布事件、取消事件订阅的能力。 11 12## 场景介绍 13 14Emitter用于同一进程内相同线程或不同线程间的事件处理,事件异步执行。使用时需要先订阅一个事件,然后发布该事件,发布完成后Emitter会将已发布的事件分发给订阅者,订阅者就会执行该事件订阅时设置的回调方法。当不需要订阅该事件时应及时取消订阅释放Emitter资源。 15 16## 运作机制 17Emitter通过维护一个内部事件队列,来进行任务分发。应用需要先订阅某个事件并设置好该事件的回调方法,当应用程序发布事件后,就会往队列里面插入一个事件。任务队列会串行执行队列里面的任务,执行任务时会调用该任务订阅者的回调方法进行事件处理。 18 19 20 21## 接口说明 22详细请参见[Emitter接口文档](../../reference/apis-basic-services-kit/js-apis-emitter.md)。 23| 接口名 | 用途 | 说明 | 24| ------- | ------ | -------- | 25| on | 订阅事件 | 持续订阅事件,直至该事件被取消订阅。 | 26| once | 订阅事件 | 订阅事件一次。 | 27| emit | 发布事件 | 发布事件一次。 | 28| off | 取消事件订阅 | 取消事件订阅后,将不再接收该事件的消息。 | 29 30## 开发步骤 31 32使用Emitter实现事件订阅、事件发送以及事件删除,开发步骤如下。 33 341. 导入模块。 35 36 ```ts 37 import { emitter, Callback } from '@kit.BasicServicesKit'; 38 ``` 39 402. 订阅事件。 41 42 订阅事件使用on(持续订阅)或者once(单次订阅)接口进行订阅,设置要订阅的事件以及接收到事件后的回调函数。 43 ```ts 44 // 定义一个eventId为1的事件。 45 let event: emitter.InnerEvent = { 46 eventId: 1 47 }; 48 // 定义一个事件的回调处理函数,当收到对应的事件后执行回调函数 49 let callback: Callback<emitter.EventData> = (eventData: emitter.EventData) => { 50 console.info(`eventData: ${JSON.stringify(eventData)}`); 51 } 52 53 // 收到eventId为1的事件后执行回调函数 54 emitter.on(event, callback); 55 ``` 56 57 ```ts 58 // 收到eventId为1的事件后执行回调函数。 59 // 注意:once订阅只接收一次事件,on订阅则一直接收直到取消订阅为止。 60 emitter.once(event, callback); 61 ``` 62 633. 发送事件。 64 65 发送事件使用emit接口进行发送,设置要发送的事件以及要传递的参数。 66 > **说明:** 67 > 68 > emit接口支持跨线程传输数据对象,需要遵循数据跨线程传输的规格约束,详见[线程间通信对象](../../arkts-utils/serializable-overview.md)。目前不支持使用[@State装饰器](../../ui/state-management/arkts-state.md)、[@Observed装饰器](../../ui/state-management/arkts-observed-and-objectlink.md)等装饰器修饰的复杂类型数据。 69 ```ts 70 // 定义一个eventId为1的事件,事件优先级为Low。 71 let event: emitter.InnerEvent = { 72 eventId: 1, 73 priority: emitter.EventPriority.LOW 74 }; 75 76 let eventData: emitter.EventData = { 77 data: { 78 content: 'emitter', 79 id: 1, 80 isEmpty: false 81 } 82 }; 83 84 // 发送eventId为1的事件,事件内容为eventData。 85 emitter.emit(event, eventData); 86 ``` 87 884. 取消事件订阅。 89 > **说明:** 90 > 91 > - 当不需要订阅某个事件时,需要及时取消订阅避免造成内存泄漏。 92 > - 使用[off](../../reference/apis-basic-services-kit/js-apis-emitter.md#emitteroff)接口取消某个事件订阅后,已通过[emit](../../reference/apis-basic-services-kit/js-apis-emitter.md#emitteremit)接口发布但尚未被执行的事件将被取消。 93 ```ts 94 // 取消eventId为1的事件。 95 emitter.off(1); 96 ``` 97