专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

解构EventBus框架(三)自己实现一个EventBus

EventBus实现的思路

定义类:

  • MyEventBus 事件总线

    方法:

    • register 注册
    • unregister 取消注册
    • post 分发
  • Event 事件
  • EventHandler 事件处理器

以下以两张图来表达实现的原理

注册:

40_1.png

分发:

40_2.png

实现EventBus最关键的地方是,维护一个事件/处理器的注册表。在收到注册请求的时候,将内容加到注册表中;在收到调用请求的时候,从注册表中取出对应的处理器并调用。

动手实现一个EventBus

定义事件-事件处理器:

public class Event<T> {
    private T entity;
    public Event() {
    }
    public Event(T entity) {
        this.entity = entity;
    }
}

public interface EventHandler {
    void handle(Event event);
}

定义EventBus:

    //注册集合
    private Map<Class<? extends Event>, List<EventHandler>> map = new HashMap<Class<? extends Event>, List<EventHandler>>();
    private Executor executor = Executors.newFixedThreadPool(10);

    public void register(Class<? extends Event> event, EventHandler eventHandler) {
        List<EventHandler> list = map.get(event);
        if(list != null) {
            list.add(eventHandler);
        } else {
            list = new ArrayList<EventHandler>();
            list.add(eventHandler);
            map.put(event,list);
        }
    }

    public void post(final Event event) {
        List<EventHandler> list = map.get(event.getClass());
        if(list != null) {
            for (final EventHandler eventHandler : list) {
                executor.execute(new Runnable() {
                    public void run() {
                        eventHandler.handle(event);
                    }
                });
            }
        }
    }

    public void unRegister(Class<? extends Event> event, EventHandler eventHandler) {
        List<EventHandler> list = map.get(event);
        if(list != null) {
            list.remove(eventHandler);
        }
    }

流程调用:

        //实例化,并注册
        MyEventBus myEventBus = new MyEventBus();
        EventHandler handler = new EventHandler() {
            public void handle(Event event) {
                User user = (User) event.getEntity();
                System.out.println(user.getId());
            }
        };
        myEventBus.register(OpenUserEvent.class,handler);

        //开户业务
        User user = new User();
        user.setId("3");
        user.setName("test");

        //实例化事件,并发送
        OpenUserEvent openUserEvent = new OpenUserEvent();
        openUserEvent.setEntity(user);
        myEventBus.post(openUserEvent);

以上我们实现了一个简单的EventBus,但这个EventBus还存在以下问题:

  • 线程安全,在注册和取消注册的时候,会产生线程安全的问题
  • 注册时,需要显示指定事件和事件处理器
  • 事件在分发过程(异步调用)中,如果出现异常,无法被调用者感知

下章节中,以Google的EventBus为例,说明如何解决以上问题

文章永久链接:https://tech.souyunku.com/36463

未经允许不得转载:搜云库技术团队 » 解构EventBus框架(三)自己实现一个EventBus

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们