以下结论基于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的值在整个注册过程中没有什么区别。
本文详细解释了EventBus 2.4.0版本的工作原理。包括如何保存注册信息、查找已注册类及其处理方法的过程,以及为何需要在Activity或Fragment销毁时进行注销操作。此外,还介绍了EventBus提供的不同注册方法之间的区别。
660

被折叠的 条评论
为什么被折叠?



