Eventbus源码走读

1.Eventbus通过DCL单例模式获取实例


DCL单例

2.在onCreate中进行register,在onDestory中进行unregister

register(this)是干嘛的呢?其实register(this)就是去当前类,遍历所有的方法,找到onEvent开头的然后进行存储


最终调用该方法

参数1.this就是类,参数2为onEvent写死,4.是优先级,越高越先被处理


返回当前类中Onevent开头的方法list

subscriptionsByEventType是个Map,key:eventType ; value:CopyOnWriteArrayList ; 这个Map其实就是EventBus存储方法的地方,一定要记住!

扫描了所有的方法,把匹配的方法最终保存在subscriptionsByEventType(Map,key:eventType ; value:CopyOnWriteArrayList<Subscription> )中

3.发布

EventBus.getDefault().post(param);

把这个param发布出去,EventBus会在它内部存储的方法中,进行扫描,找到参数匹配的,就使用反射进行调用。


Threadlocal线程隔离

遍历队列中的所有的event,调用postSingleEvent(eventQueue.remove(0), postingState)方法。

postSingleEvent历所有的Class,到subscriptionsByEventType去查找subscriptions

void invokeSubscriber(Subscription subscription, Object event) throws Error {

            subscription.subscriberMethod.method.invoke(subscription.subscriber, event);

  }

直接反射调用;也就是说在当前的线程直接调用该方法;

register会把当前类中匹配的方法,存入一个map,而post会根据实参去map查找进行反射调用。分析这么久,一句话就说完了~~


public void onEventMainThread(param){}

public void onEventPostThread(param)

public void onEventBackgroundThread(param)

public void onEventAsync(param)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • EventBus基本使用 EventBus基于观察者模式的Android事件分发总线。 从这个图可以看出,Even...
    顾氏名清明阅读 3,798评论 0 1
  • 项目到了一定阶段会出现一种甜蜜的负担:业务的不断发展与人员的流动性越来越大,代码维护与测试回归流程越来越繁琐。这个...
    fdacc6a1e764阅读 8,409评论 0 6
  • 先吐槽一下博客园的MarkDown编辑器,推出的时候还很高兴博客园支持MarkDown了,试用了下发现支持不完善就...
    Ten_Minutes阅读 3,638评论 0 2
  • EventBus源码阅读记录 EventBus是一个Android上用的消息分发的类库,非常灵活好用,主要的原理是...
    圣骑士wind阅读 3,947评论 0 6
  • EventBus用法及源码解析目录介绍1.EventBus简介1.1 EventBus的三要素1.2 EventB...
    杨充211阅读 5,921评论 0 4