有关EventBus的一些问答

来源:互联网 发布:python 提醒 编辑:程序博客网 时间:2024/05/02 02:14

以下结论基于EventBus2.4.0

1.问: 注册EventBus后,EventBus怎么保存我们的注册信息,这里的注册信息包括我们是在哪个Activity或Fragment中注册的,注册的事件,以及接收事件时处理的方法?

答:EventBus通过反射找到我们的事件类型和接收事件处理的方法,以及处理事件时的线程模式,封装到一个叫SubscriberMethod的类中,然后把SubscriberMethod和当前注册的Activity或Fragment又封装到一个叫Subscription的类中,最后以事件类型为key,以CopyOnWriteArrayList<Subscription>为value放到一个HashMap中。

2.问:EventBus发送事件后,如何找到我们注册的类,和处理的方法?

答:EventBus发送事件后,会以我们发送的事件类型为key到一个HashMap中,找到相应的value-》CopyOnWriteArrayList<Subscription>然后遍历该CopyOnWriteArrayList,拿到每一个Subscription,通过Subscription拿到注册的Activity或Frament,以及SubscriberMethod,再通过SubscriberMethod拿到处理的方法,最后执行。

3.问:为什么要在Activity或Frament的销毁方法中,注销EventBus?

答:通过上面的两个问答,大家应该知道,EventBus把我们注册的每一个Activity或Fragment保存到了HashMap中,当我们销毁了Activity和Fragment后,EventBus还是可以通过HashMap找到我们注册的类,从而还会执行相应的事件处理方法,这会浪费我们的内存和影响到我们app的性能,所以,不用的时候,要及时注销EventBus。

4.问:EventBus的四种注册方法有什么区别?

答:
EventBus的四种注册方法分别为
1. register(Object subscriber)
2. register(Object subscriber, int priority)
3. registerSticky(Object subscriber)
4. registerSticky(Object subscriber, int priority)
其实EventBus总共有五种注册方法,还有一种是
register(Object subscriber, boolean sticky, int priority)只不过这个是private修饰的,所以我们不能直接调用。当我们调用上面四种方法时,最后都调用了第五种方法。
所以归根结底,四种方法的区别就是priority和sticky的区别,
至于sticky的值在整个注册过程中没有什么区别。

0 0