EventBus通过订阅用户来在activity,fragment,service以及一些控件之间进行消息的传递。代替原生的handler,Broadcast,intent, 以及自定义的一些interface接口进行轻量化的传递。
到了订阅的方法,根据SubscriberMethod中eventType来在subscriptionsByEventType中寻找是否有订阅信息,不存在就put到改map中,存在则抛出异常提示已经存在。 值得注意的地方是:
这里注册订阅完成以后,就可以通过EventBus.getDefault().post(event);来进行事件的分发了
postToSubscription 函数中会判断订阅者的 ThreadMode,从而决定在什么 Mode 下执行事件响应函数。ThreadMode 共有四类:
PostThread:默认的 ThreadMode,表示在执行 Post 操作的线程直接调用订阅者的事件响应方法,不论该线程是否为主线程(UI 线程)。当该线程为主线程时,响应方法中不能有耗时操作,否则有卡主线程的风险。适用场景:对于是否在主线程执行无要求,但若 Post 线程为主线程,不能耗时的操作; MainThread:在主线程中执行响应方法。如果发布线程就是主线程,则直接调用订阅者的事件响应方法,否则通过主线程的 Handler 发送消息在主线程中处理——调用订阅者的事件响应函数。显然,MainThread类的方法也不能有耗时操作,以避免卡主线程。适用场景:必须在主线程执行的操作; BackgroundThread:在后台线程中执行响应方法。如果发布线程不是主线程,则直接调用订阅者的事件响应函数,否则启动唯一的后台线程去处理。由于后台线程是唯一的,当事件超过一个的时候,它们会被放在队列中依次执行,因此该类响应方法虽然没有PostThread类和MainThread类方法对性能敏感,但最好不要有重度耗时的操作或太频繁的轻度耗时操作,以造成其他操作等待。适用场景:操作轻微耗时且不会过于频繁,即一般的耗时操作都可以放在这里; Async:不论发布线程是否为主线程,都使用一个空闲线程来处理。和BackgroundThread不同的是,Async类的所有线程是相互独立的,因此不会出现卡线程的问题。适用场景:长耗时操作,例如网络访问。
最后一步就是解除订阅unregister() 通过typesBySubscriber来取出这个subscriber订阅者订阅类型,从typesBySubscriber移除该subscriber,后续事件发送就不会找到改订阅者信息。
这是本人第一次写笔记,由于很多东西看了就忘记了,所以打算通过这样的方法进行记录所学,由于水平有限对源码看的不是很透彻,这里特别感谢JangGwa的文章,对应源码再看一遍很有帮助,如有写的有问题的地方希望指正,谢谢大家。 参考:https://www.jianshu.com/p/d1cb4ecd357f