鸿蒙harmony--线程间处理和发送事件Emitter

news/2024/7/21 11:54:31 标签: harmonyos, 华为, Harmony, 鸿蒙

想的太多生活中就全是问题,可当你开始行动,这些问题其实都是有答案的,解决焦虑的最好方式,就是把所有的问题都落实到行动上,当你真正开始行动起来,你就会发现这些问题,其实都不是问题!

目录

一,定义

二,主要API

2.1EventPriority

2.2 emitter.on

 2.3 emitter.once

2.4 emitter.off

2.5 emitter.emit

2.6 InnerEvent

2.7 EventData 

三,使用

一,定义

类似于android中的EventBus线程间发送事件和处理事件,鸿蒙采用了Emitter来提供线程间发送和处理事件的能力,包括对持续订阅事件或单次订阅事件的处理、取消订阅事件、发送事件到事件队列等。

二,主要API

2.1EventPriority

用于表示事件被发送的优先级。

系统能力SystemCapability.Notification.Emitter

名称说明
IMMEDIATE0表示事件被立即投递。
HIGH1表示事件先于LOW优先级投递。
LOW2表示事件优于IDLE优先级投递,事件的默认优先级是LOW。
IDLE3表示在没有其他事件的情况下,才投递该事件。

2.2 emitter.on

on(event: InnerEvent, callback: Callback<EventData>): void

持续订阅指定的事件,并在接收到该事件时,执行对应的回调处理函数。

参数:

参数名类型必填说明
eventInnerEvent持续订阅的事件,其中EventPriority,在订阅事件时无需指定,也不生效
callbackCallback<EventData>接收到该事件时需要执行的回调处理函数

 2.3 emitter.once

once(event: InnerEvent, callback: Callback<EventData>): void

单次订阅指定的事件,并在接收到该事件并执行完相应的回调函数后,自动取消订阅。

参数:

参数名类型必填说明
eventInnerEvent单次订阅的事件,其中

EventPriority ,在订阅事件时无需指定,也不生效

callbackCallback<EventData>接收到该事件时需要执行的回调处理函数

2.4 emitter.off

off(eventId: number, callback: Callback<EventData>): void

取消针对该事件ID的订阅,传入可选参数callback,并且该callback已经通过on或者once接口订阅,则取消该订阅;否则,不做任何处理。

参数:

参数名类型必填说明
eventIdnumber事件ID
callback10+Callback<EventData>API version 10 新增取消该事件的回调处理函数。

2.5 emitter.emit

emit(event: InnerEvent, data?: EventData): void

发送指定的事件。

参数:

参数名类型必填说明
event​​​​​​​InnerEvent发送的事件,其中EventPriority用于指定事件被发送的优先级
dataEventData事件携带的数据

2.6 InnerEvent

订阅或发送的事件,订阅事件时EventPriority不生效。

名称类型可读可写说明
eventIdnumber事件ID,由开发者定义用来辨别事件。
priorityEventPriority事件被投递的优先级。

2.7 EventData 

发送事件时传递的数据。

名称类型可读可写说明
data[key: string]: any发送事件时传递的数据,数据类型支持字符串、整型和布尔型。
其中字符串长度最大为10240字节。

三,使用

 ①简单封装一个EventBus单例:

import emitter from '@ohos.events.emitter'

export default class EventBus{

  private static instace: EventBus

  private constructor() {

  }
  static getInstance(): EventBus {
    if (!EventBus.instace) {
      EventBus.instace = new EventBus()
    }
    return EventBus.instace
  }

  //持续订阅指定的事件,并在接收到该事件时,执行对应的回调处理函数。
  on(name:number,callback:(eventData:emitter.EventData)=>void){
    let event :emitter.InnerEvent={
      eventId:name, //事件ID
      priority:emitter.EventPriority.IMMEDIATE //事件立即被投递
    }
    emitter.on(event,callback)
  }

 
  //取消针对该事件ID的订阅,传入可选参数callback,并且该callback已经通过on或者once接口订阅,则取消该订阅;否则,不做任何处理。
  unregister(name:number){
    emitter.off(name)
  }
  //发送指定的事件
   post(name:number,data?:emitter.EventData){
     let event :emitter.InnerEvent={
       eventId:name, //事件ID
       priority:emitter.EventPriority.IMMEDIATE //事件立即被投递
     }
     let eventdata: emitter.EventData = {
       data:data
     }
     emitter.emit(event,eventdata)
   }

}

②,定义事件id

export enum AppEvent{
  EVENT_TEST = 1,
  EVENT_TEST2 = 2,
  EVENT_TEST3 = 3,
}

③发送事件

import EventBus from './EventBus'
import { AppEvent } from './AppEvent'
import emitter from '@ohos.events.emitter'

@Entry
@Component
struct SecondPage {
  build() {
    Column() {
      Text("第二页").onClick(()=>{
        let data:emitter.EventData ={data:{
          name:"袁震",
        }}
        EventBus.getInstance().post(AppEvent.EVENT_TEST,data)
      })

    }.width("100%").height("100%")
  }
}

④,订阅事件,解绑事件

import { AppEvent } from './AppEvent'
import EventBus from './EventBus'

@Entry
@Component
struct FirstPage {


  aboutToAppear(){
      EventBus.getInstance().on(AppEvent.EVENT_TEST,(data)=>{
          console.info("yz----data:"+data.data)
      })
  }

  aboutToDisappear(){
    EventBus.getInstance().unregister(AppEvent.EVENT_TEST)
  }

  build() {
    Flex({direction: FlexDirection.Row,wrap: FlexWrap.Wrap}) {
      Text('袁震1').flexBasis('auto').width('25%').height(50).backgroundColor("#D2d28C")
      Text('袁震2').flexBasis(100).height(60).backgroundColor("#554433")
      Text('袁震3').flexBasis(200).width('35%').height(70).backgroundColor("#668888")
      Text('袁震3').width('40%').height(70).backgroundColor("#6688cc").flexBasis('60%')
      Text('袁震3').width('45%').height(70).backgroundColor("#668822").flexBasis('70%')
      Text('袁震3').width('50%').height(70).backgroundColor("#668866").flexBasis('80%')
    }.width("100%").height("100%")
  }
}

使用很简单,和android框架EventBus也是非常相似


http://www.niftyadmin.cn/n/5338492.html

相关文章

开发安全之:System Information Leak: External

Overview 在调用 phpinfo() 过程中&#xff0c;程序可能会显示系统数据或调试信息。由 phpinfo() 揭示的信息有助于攻击者制定攻击计划。 Details 当系统数据或调试信息通过套接字或网络连接使程序流向远程机器时&#xff0c;就会发生外部信息泄露。 示例 1&#xff1a;以下…

国产操作系统:VirtualBox安装openKylin-1.0.1虚拟机并配置网络

国产操作系统&#xff1a;VirtualBox安装openKylin-1.0.1虚拟机并配置网络 openKylin 操作系统目前适配支持X86、ARM、RISC-V三个架构的个人电脑、平板电脑及教育开发板&#xff0c;可以满足绝大多数个人用户及开发者的使用需求。适用于在VirtualBox平台上安装openKylin-1.0.1…

日常常见应用组件升级记录

一、前言 因近期安全扫描&#xff0c;发现java后端应用涉及多个引用组件版本过低&#xff0c;涉及潜在漏洞利用风险&#xff0c;特记录相关处理升级处理过程&#xff0c;以备后续确认&#xff1b; 二、升级处理过程 2.1、Java类应用内置Spring Boot版本升级 Spring Boot是一…

【蓝桥杯日记】复盘篇一:深入浅出顺序结构

&#x1f680;前言 本期是一篇关于顺序结构的题目的复盘,通过复盘基础知识&#xff0c;进而把基础知识学习牢固&#xff01;通过例题而进行复习基础知识。 &#x1f6a9;目录 前言 1.字符三角形 分析&#xff1a; 知识点&#xff1a; 代码如下 2. 字母转换 题目分析: 知…

基于SSM的食品安全追溯系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的食品安全追溯系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring …

常用设计模式(工厂方法,抽象工厂,责任链,装饰器模式)

前言 有关设计模式的其他常用模式请参考 单例模式的实现 常见的设计模式(模板与方法&#xff0c;观察者模式&#xff0c;策略模式) 工程方法 定义 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。 ——《设…

【Java程序员面试专栏 专业技能篇】MySQL核心面试指引(三):性能优化策略

关于MySQL部分的核心知识进行一网打尽,包括三部分:基础知识考察、核心机制策略、性能优化策略,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第三部分:性能优化策略,子节点表示追问或同级提问 读写分离 分布式数据库的…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-帖子详情页实现

锋哥原创的SpringbootLayui python222网站实战&#xff1a; python222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火…