EventBus小结

1,注册register:

在subscribe方法中通过eventType(实参类型)去subScriptionByEventType中查找存储在该集合中的方法,顺便把我们传入的实参封装成了subscription,

如果没有找到则创建。根据实参类型找到所有匹配的方法之后,根据优先级将新创建的存储着对应方法的集合插入进存储匹配方法的集合中,插入完数据之后再使用eventType做键存储着对应方法的集合(subscribedEvents)做值存储进subScriptionByEventType集合中

最后判断sticky,如果为true,根据eventType(实参类型)去stickyEvents(存储着sticky的map)中去查找对应的stickyEvent,如果有对应的则立即发布出去
stickyEvent实际上就是我们post时的实参

在这个方法中实际上就是做了一件事:扫描了所有的方法,最终把匹配到的方法保存到了subsriptionByEventType这个键值对的map中,其中key就是我们方法中实参的类型(eventType)
value就是存储着这个eventType匹配的所有方法


2,发送 post方法:
进入到post方法首先获取到postingstate,然后把post的实参添加到postingstate的eventQueue中,然后判断了当前的post方法是否在执行,如果当前post方法正在被执行那么就直接return
这个判断是为了防止post方法被多次执行,在执行的时候会把这个判断的条件isPosting赋值为true,在执行完毕之后赋值为false
在判断当前post是否在执行之后,执行当前post方法的时候判断是否是在主线程中执行,为postingstate的isMainThread赋值
然后遍历eventQueue得到所有event调用postSingleEvent方法

在postSingleEvent方法中得到post实参的类型,也就是register存储到subScriptionByEvent这个map中的键,然后通过这个eventType去循环遍历这个map获取到匹配的方法
然后依次去调用postToSubscription方法这个方法就是反射执行方法了

postToSubscription:
在这个方法中通过传过来的subScriptionByEvent中的value中的threadMode去判断在哪个线程中执行(MainThread、PostThread、Async、BackgroundThread)

post方法实际上就是根据参数去查找方法,然后通过反射区调用


3,unregister取消注册

(1)通过subscriber(类名做key)从typesBySubscriber(Map)中获取存储eventType(value)的集合List<class<?>> subscribedTypes

(2)通过eventType(key)从subscriptionsByEventType(Map)中获取存储Subscription的集合List<Subscription> subscriptions

(3)从subscriptions中移除对用的subscriber的subscription,从typesBySubscriber中移除对应的subscriber的集合

猜你喜欢

转载自blog.csdn.net/qq_32671919/article/details/80996610