EventBus

102 阅读2分钟

结论:

1. 如果订阅类中的方法的参数类型相同(不管哪个类只要订阅了,并且满足两个条件第一方法参数类型及参数个数相同(也就是说 我post只发了String 你的参数接受类型必须为String 而且参数个数只有一个)),则都会接受到事件 如下都会接受到发来的String类型的事件

public void onString1(String event) {  
    Log.*e*("liu",event+1);  
}  
  
  
@Subscribe(threadMode = ThreadMode.*MAIN*)  
public void onString2(String event) {  
    Log.*e*("liu",event+2);  
}

2. 订阅方法一定是 public 其他都不行

3. 如果发射的类型没有找到相关订阅方法则会报错 entbustest.MainActivity and its super classes have no public methods with the @Subscribe annotation

4. 优先级数值越大 ****优先级越高并先接受到事件 如下, onString2 方法先接受到

public void onString1(StringEvent event) {  
    Log.*e*("liu",1+"");  
}  
  
  
@Subscribe(threadMode = ThreadMode.*MAIN*,priority = 2)  
public void onString2(StringEvent event) {  
    Log.*e*("liu",2+"");  
}

线程调度

默认情况\color{red}{默认情况}(没有指定接受线程)订阅方法的执行线程是根据发送事件的post而定的,如果post 是在主线程发送的 那么接受也在主线程,如果发送在子线程  接受也在子线程,原理:eventbus在注册时的时候会会把所有的订阅方法收集一个集合内,而post方法会根据方法参数类型在集合中查找,并执行其方法,也就是说 post 方法会调用订阅方法,如果post在主线程也就是说在主线程调用的订阅方法,当然在主线程中执行,子线程程也一样,除非不使用默认情况,在订阅的时候指定订阅方法块所执行的线程\color{red}{除非不使用默认情况,在订阅的时候指定订阅方法块所执行的线程}

源码流程

Eventbus 首先是个单例,所以需要解绑定,避免内存泄露

订阅过程 register

拿到传进来的对象  通过反射拿到所有方法 (去掉父类的方法),然后循环遍历方法拿到有指定注解(subscribe)的方法,然后把拿到符合要求方法放到一个meothManager封装起来(meothManager属性包括方法的参数类型,线程模式,当前的方法对象)封装后放在一个list 集合,然后把list集合放到一个map集合key为regiest传入的对象 , 也就是所有注册过类 ****只要没有反注册 ****所有的订阅方法 都统一放在了一个 map 集合

发布过程 post

通过 post 的传入的对象类型 到全局 map 查找的过程,匹配所有的参数类型与 post 发送类型相同的方法 然后执行所有方法 invoke 方法