助力软件开发企业降本增效 PHP / java源码系统,只需一次付费,代码终身使用! 广告
[TOC] ## 两个全局变量 **Map, CopyOnWriteArrayList> subscriptionsByEventType** 其中key是eventType,value为监听者 我们投递订阅事件的时候,**就是根据我们的EventType找到我们的订阅事件,从而去分发事件,处理事件的** **Map>> typesBySubscriber** 其中key是订阅者实例对象,value为该订阅者订阅了的eventType列表 **根据订阅者找到EventType,又根据EventType找到订阅事件,从而对订阅者进行解绑** ## 注册过程 ![](https://img.kancloud.cn/e4/8c/e48c3c5839e445a8cdc8ace3b6353c9e_578x815.png) ## 通知过程 ![](https://img.kancloud.cn/6a/3f/6a3f748b0c94520e8ffbffcd636cc07e_637x991.png) 图中根据ThreadModel,通过不同的poster,可以分为四种情况 1. POSTING,调用invokeSubscriber(subscription, event)处理事件,本质是method.invoke()反射 2. MAIN,如果在主线程直接invokeSubscriber处理;反之通过handler切换到主线程调用invokeSubscriber处理事件 3. BACKGROUND,如果不在主线程直接invokeSubscriber处理事件;反之开启一条线程,在线程中调用invokeSubscriber处理事件 4. ASYNC,开启一条线程,在线程中调用invokeSubscriber处理事件