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