2

3

4

5

6

7

8

9

10

11

12public class EventBus { 

    HashMap<Class<?>,ArrayList<Subscription>> subscriptionsByEventType = 

            new HashMap<Class<?>,ArrayList<Subscription>>(); 

    MainThreadHandler mainThreadHandler = new MainThreadHandler(this,Looper.getMainLooper()); 

    AsyThreadHandler asyThreadHandler = new AsyThreadHandler(this); 

    private final static EventBus instance = new EventBus(); 

    public static EventBus getInstance(){ 

           return instance; 

    } 

    private EventBus(){}; 

}

在这其中:

register方法之中我们先获取了订阅者(例子中是MainActivity)的方法,找到onEvent开头的方法,获得它们的参数类型。然后判断subscriptionsByEventType是否有以这些参数类型为key的数据,如果没有,新建一个ArrayList<Subscription>。

Subscription它代表一个订阅,拥有subsriber,也就是订阅者还有一个SubscriberMethod,这是订阅方法类。

post()方法里面,如同我们上面所说,获取了参数类型,然后在subscriptionsByEventType中查询所有改类型对应的订阅Subscription对于Subscription,它有我们订阅类的所有信息。首先根据type判断是在主线程还是子线程执行,然后调用一开始讲到的两个类的实例就好了。

invoke()其实只有一句话,就是调用了反射去执行方法。m是订阅方法,sub.subscriber就是订阅者,event就是post()方法传入的实体这样我们就在子线程中调用了这个方法了,相当于MainActivity主动调用这个方法。

因为这个模式的使用较少所以网上可以找到的只有这一种实例,其实事件总线这个概念对你来说可能很陌生,但提到观察者(发布-订阅)模式,你也许就很熟悉。事件总线是对发布-订阅模式的一种实现。它是一种集中式事件处理机制,允许不同的组件之间进行彼此通信而又不需要相互依赖,达到一种解耦的目的。