• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 事件通知开发常见问题
2
3## 如何封装一个通用的commonEvent工具类
4
5适用于OpenHarmony 3.1 Beta5  API 9
6
7**问题现象**
8
9封装一个通用的commonEvent工具类:希望在创建订阅者的同时注册一个自定义的回调函数,然后在收到事件通知的同时能调用这个自定义的回调函数。
10
11**解决措施**
12
13```
14import commonEvent from '@ohos.commonEventManager';
15
16export class SubscribeEvent {
17  private static subscriber = null
18  // 自定义的回调函数变量
19  private static callback = null
20  /**
21   * 创建订阅者
22   * @param subscribeInfo 订阅事件
23   * @callback 用户自定义回调函数
24   */
25  static createSubscriber(subscribeInfo, callback:(a,b)=>void) {
26    this.callback = callback
27    commonEvent.createSubscriber(subscribeInfo, (err, subscriber) => {
28      if (err) {
29        console.error('CreateSubscriberCallBack err = ' + JSON.stringify(err))
30      } else {
31        this.subscriber = subscriber;
32        this.subscribe(this.subscriber)
33        console.info('Create subscriber succeed')
34      }
35    })
36  }
37
38  /**
39   * 订阅公共事件
40   * @param subscriber 订阅者
41   */
42  private static subscribe(subscriber) {
43    if (subscriber != null) {
44      commonEvent.subscribe(subscriber, (err, data) => {
45        if (err) {
46          console.error('subscribe err = ' + JSON.stringify(err))
47        } else {
48          console.info('SubscribeCallBack data= ' + JSON.stringify(data))
49          this.callback('hello callback', data)
50        }
51      })
52    } else {
53      console.info("Need create subscriber")
54    }
55  }
56}
57
58@Entry
59@Component
60struct Faq10_1 {
61  @State message: string = ''
62
63  build() {
64    Row() {
65      Column() {
66        Text('订阅:' + this.message)
67          .fontSize(30)
68          .fontWeight(FontWeight.Bold)
69          .onClick(() => {
70            let subscribeInfo = {
71              events: ["myEvent"]
72            };
73            let callback = (a,b) => {
74              this.message = a
75            }
76            SubscribeEvent.createSubscriber(subscribeInfo,callback)
77          })
78        Text('发布')
79          .fontSize(30)
80          .fontWeight(FontWeight.Bold)
81          .onClick(() => {
82            //公共事件相关信息
83            let options = {
84              code: 0,    //公共事件的初始代码
85              data: "initial data",//公共事件的初始数据
86              isOrdered: true  //有序公共事件
87            }
88            //发布公共事件回调
89            function publishCB(err) {
90              if (err) {
91                console.error(`publish failed, code is ${err.code}, message is ${err.message}`);
92              } else {
93                console.info("publish");
94              }
95            }
96            //发布公共事件
97            try {
98              commonEvent.publish("myEvent", options, publishCB);
99            } catch (err) {
100              console.error(`publish failed, code is ${err.code}, message is ${err.message}`);
101            }
102          })
103      }
104      .width('100%')
105    }
106    .height('100%')
107  }
108}
109```
110
111**参考链接**
112
113[公共事件模块](../reference/apis/js-apis-commonEventManager.md)
114
115## 如何让事件只在一个UIAbility实例中传递
116
117适用于:OpenHarmony 3.2 Beta5  API 9
118
119**问题现象**
120
121应该如何实现事件只在一个UIAbility实例中订阅和触发
122
123**解决措施**
124
125在UIAbility中使用EventHub订阅事件,EventHub模块提供了事件中心,提供订阅、取消订阅、触发事件的能力
126
127**代码示例**
128
129```
130import UIAbility from '@ohos.app.ability.UIAbility';
131 export default class EntryAbility extends UIAbility {
132    onForeground() {
133        this.context.eventHub.on('myEvent', this.eventFunc);
134        // 结果:
135        // eventFunc is called,undefined,undefined
136        this.context.eventHub.emit('myEvent');
137        // 结果:
138        // eventFunc is called,1,undefined
139        this.context.eventHub.emit('myEvent', 1);
140        // 结果:
141        // eventFunc is called,1,2
142        this.context.eventHub.emit('myEvent', 1, 2);
143    }
144     eventFunc(argOne, argTwo) {
145        console.log('eventFunc is called, ${argOne}, ${argTwo}');
146    }}
147```
148
149**参考链接**
150
151[使用EventHub进行数据](../application-models/uiability-data-sync-with-ui.md#使用eventhub进行数据通信)
152