Emitter与EventHub的区别是什么?

Emitter与EventHub都可以用于事件分发,可以描述一下两者的区别吗,需要选择其一作为项目内统一的事件分发工具。

HarmonyOS
2024-09-30 09:43:27
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
Heiang

Emitter主要提供线程间发送和处理事件的能力,包括对持续订阅事件或单次订阅事件的处理、取消订阅事件、发送事件到事件队列等。EventHub提供了一种基于发布订阅模式的事件机制,通过订阅和发布自定义事件,实现UIAbility组件/ExtensionAbility组件与UI之间的数据同步。以下是一个使用EventHub的示例:

import UIAbility from '@ohos.app.ability.UIAbility';  
  
const TAG: string = '[Example].[Entry].[EntryAbility]';  
  
export default class EntryAbility extends UIAbility {  
  func1(...data) {  
    // 处理收到的事件数据  
    console.info(TAG, '1. ' + JSON.stringify(data));  
  }  
  
  onCreate(want, launch) {  
    // 获取eventHub  
    let eventhub = this.context.eventHub;  
    // 订阅事件  
    eventhub.on('event1', this.func1);  
    eventhub.on('event1', (...data) => {  
      // 处理收到的事件数据  
      console.info(TAG, '2. ' + JSON.stringify(data));  
    });  
  }  
}

在UI界面中,通过eventHub.emit()方法触发自定义事件,并根据需要传递参数信息。以下是一个UI界面中触发事件的示例:

import common from '@ohos.app.ability.common';  
  
@Entry  
@Component  
struct Index {  
  private context = getContext(this) as common.UIAbilityContext;  
  
  eventHubFunc() {  
    // 触发自定义事件"event1",可以传递参数  
    this.context.eventHub.emit('event1');  
    this.context.eventHub.emit('event1', 1);  
    this.context.eventHub.emit('event1', 2, 'test');  
    // 开发者可以根据实际的业务场景设计事件传递的参数  
  }  
  
  // 页面展示  
  build() {  
    // ...  
  }  
}

在UIAbility的注册事件回调中,可以得到对应的触发事件结果,日志结果会显示收到的事件数据。Emitter主要提供线程间发送和处理事件的能力,包括对持续订阅事件或单次订阅事件的处理、取消订阅事件、发送事件到事件队列等。

Emitter的开发步骤如下:

订阅事件  
import emitter from "@ohos.events.emitter";  
  
// 定义一个eventId为1的事件  
let event = {  
  eventId: 1  
};  
  
// 收到eventId为1的事件后执行该回调  
let callback = (eventData) => {  
  console.info('event callback');  
};  
  
// 订阅eventId为1的事件  
emitter.on(event, callback);  
发送事件  
import emitter from "@ohos.events.emitter";  
  
// 定义一个eventId为1的事件,事件优先级为Low  
let event = {  
  eventId: 1,  
  priority: emitter.EventPriority.LOW  
};  
  
let eventData = {  
  data: {  
    "content": "c",  
    "id": 1,  
    "isEmpty": false,  
  }  
};  
  
// 发送eventId为1的事件,事件内容为eventData  
emitter.emit(event, eventData);

总的来说,EventHub更适合解耦组件之间的依赖关系,而Emitter更适合实现单向数据流。EventHubEventHub模块提供了事件中心,提供订阅、取消订阅、触发事件的能力。特点:仅stage模型可用通过context直接获取,作用范围与使用的context等价。

EmitterEmitter模块提供了在同一进程不同线程间,或同一进程同一线程内,发送和处理事件的能力,包括持续订阅事件、单次订阅事件、取消订阅事件,以及发送事件到事件队列的能力。特点:FA与Stage都可以用可以与worker搭配使用。

commonEventManagerCommonEvent模块提供了公共事件相关的能力,包括发布公共事件、订阅公共事件、以及退订公共事件。特点:

订阅系统的公共事件,比如低电量提示、开始充电等。应用间通信,可以添加权限管控。如何选择主线程内通信:EventHub主线程与Worker间通信:Emitter应用间通信:commonEventManager获取系统公共事件信息(低电量、充电信息):commonEventManager

commonEventManager 比如在多个线程订阅了事件,当事件发布时,多个线程都会响应。

分享
微博
QQ
微信
回复
2024-09-30 16:56:38
相关问题
FA模型Stage模型区别是什么
444浏览 • 1回复 待解决
HTTP原生库RCP区别是什么
341浏览 • 1回复 待解决
HAP和HAR区别是什么
1927浏览 • 1回复 待解决
sync和await区别是什么?
273浏览 • 1回复 待解决
navigation和router区别是什么
762浏览 • 1回复 待解决
多态和多模区别是什么
5674浏览 • 2回复 已解决
关于emittereventHub使用场景
2469浏览 • 1回复 待解决