如何封装一个通用的commonEvent工具类?

问题现象

封装一个通用的commonEvent工具类:希望在创建订阅者的同时注册一个自定义的回调函数,然后在收到事件通知的同时能调用这个自定义的回调函数。

阅读 514
avatarAI BotBETA

在Java中,你可以通过创建一个通用的CommonEvent工具类来实现这个需求。这个类可以包含一个用于注册回调函数的公共方法,以及一个用于触发事件的方法。

以下是一个简单的示例:

import java.util.HashMap;
import java.util.Map;

public class CommonEvent {
    // 存储订阅者和他们对应的回调函数
    private Map<Object, Runnable> subscribers = new HashMap<>();

    // 注册订阅者,并关联一个回调函数
    public void register(Object subscriber, Runnable callback) {
        subscribers.put(subscriber, callback);
    }

    // 触发事件,并执行关联的回调函数
    public void trigger(Object... data) {
        for (Map.Entry<Object, Runnable> entry : subscribers.entrySet()) {
            entry.getValue().run();
        }
    }
}

在这个示例中,CommonEvent类使用了一个Map来存储订阅者和他们对应的回调函数。register方法用于注册一个新的订阅者和他们的回调函数,而trigger方法则用于触发事件并执行所有关联的回调函数。

你可以像下面这样使用这个工具类:

public class Main {
    public static void main(String[] args) {
        CommonEvent event = new CommonEvent();
        event.register(new Object() {
            @Override
            public String toString() {
                return "Subscriber1";
            }
        }, () -> System.out.println("Event triggered for Subscriber1"));
        event.register(new Object() {
            @Override
            public String toString() {
                return "Subscriber2";
            }
        }, () -> System.out.println("Event triggered for Subscriber2"));
        event.trigger();  // 触发事件,输出:Event triggered for Subscriber1 和 Event triggered for Subscriber2
    }
}
1 个回答

示例代码

import { commonEventManager , BusinessError } from '@kit.BasicServicesKit'; 
 
export class SubscribeEvent { 
  private static subscriber: commonEventManager.CommonEventSubscriber 
  // 自定义的回调函数变量 
  private static callback: (a: BusinessError, b: commonEventManager.CommonEventSubscriber) => void 
 
  /** 
   * 创建订阅者 
   * @param subscribeInfo 订阅事件 
   * @callback 用户自定义回调函数 
   */ 
  static createSubscriber(subscribeInfo: commonEventManager.CommonEventSubscribeInfo, callback: (err: BusinessError, commonEventSubscriber: commonEventManager.CommonEventSubscriber) => void) { 
    SubscribeEvent.callback = callback 
    commonEventManager.createSubscriber(subscribeInfo, (err: BusinessError, subscriber) => { 
      if (err) { 
        console.error('CreateSubscriberCallBack err = ' + JSON.stringify(err)) 
      } else { 
        SubscribeEvent.subscriber = subscriber; 
        SubscribeEvent.subscribe(subscriber) 
        console.info('Create subscriber succeed') 
      } 
    }) 
  } 
 
  /** 
   * 订阅公共事件 
   * @param subscriber 订阅者 
   */ 
  private static subscribe(subscriber: commonEventManager.CommonEventSubscriber) { 
    if (subscriber != null) { 
      commonEventManager.subscribe(subscriber, (err: BusinessError, data) => { 
        if (err) { 
          console.error('subscribe err = ' + JSON.stringify(err)) 
        } else { 
          console.info('SubscribeCallBack data= ' + JSON.stringify(data)) 
          // this.callback('hello callback', data) 
        } 
      }) 
    } else { 
      console.info("Need create subscriber") 
    } 
  } 
} 
 
@Entry 
@Component 
struct Faq10_1 { 
  @State message: string = '' 
 
  //发布公共事件回调 
  publishCB(err: BusinessError) { 
     if (err) { 
      console.error(`publish failed, code is ${err.code}, message is ${err.message}`); 
    } else { 
      console.info("publish") 
      ; 
    } 
  } 
 
  build() { 
    Row() { 
      Column() { 
        Text('订阅:' + this.message) 
          .fontSize(30) 
          .fontWeight(FontWeight.Bold) 
          .onClick(() => { 
            let subscribeInfo: commonEventManager.CommonEventSubscribeInfo = { 
              events: ["myEvent"] 
            }; 
            let callback = (a: BusinessError, b: commonEventManager.CommonEventSubscriber) => { 
              this.message = a.name 
            } 
            SubscribeEvent.createSubscriber(subscribeInfo, callback) 
          }) 
        Text('发布') 
          .fontSize(30) 
          .fontWeight(FontWeight.Bold) 
          .onClick(() => { 
            //公共事件相关信息 
            let options: commonEventManager.CommonEventPublishData = { 
              code: 0, //公共事件的初始代码 
              data: "initial data", //公共事件的初始数据 
              isOrdered: true  //有序公共事件 
            } 
            //发布公共事件 
            try { 
              commonEventManager.publish("myEvent", options, this.publishCB); 
            } catch (err) { 
              console.error(`publish failed, code is ${err.code}, message is ${err.message}`); 
            } 
          }) 
      } 
      .width('100%') 
    } 
    .height('100%') 
  } 
}

参考链接

公共事件模块

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进