阅读eventbus源码笔记

阅读eventbus源码笔记
一.eventbus的register注册主要做了两件事情
1.解析被@subscriber注解标记的方法并返回一个带有改方法信息的集合List
这个是如何实现的呢? 通过register(Object object)方法传入的当前界面的实例获取Class类型的对象,如果有依赖eventbus的apt则用apt解析@subscriber注解标记的方法,如果没有的话则用反射解析.解析的时候也遍历父类是否有@subscriber注解标记的方法
2.订阅event事件
通过遍历返回的List集合,获取event事件类型,再把当前界面的对象和SubscriberMethod封装到Subscription中,然后把Subscription添加到一个Subscriptions的list集合中,在通过一个subscriptionsByEventType的map把event事件类型做个key,Subscriptions集合作为value存到map中.还对该map集合进行优先级的排序;然后用一个typesBySubscriber的map记录当前界面的的event事件,就是一个当前界面为key,event事件list的集合为value存在到typesBySubscriber中,
二 .eventbus的post发送event事件,通过event事件类型从subscriptionsByEventType获取Subscriptions集合,在遍历这个集合,通过反射的方法一一调用对应注册了改event事件的方法把数据传递过去.
三.eventbus的反注册unregister(Object subscriber)
通过subscriber从typesBySubscriber中获取event事件集合,遍历改集合注销event事件,并在typesBySubscriber移除该event事件集合typesBySubscriber.remove(subscriber);
四.eventbus的线程切换
1.切换到主线程是通过handler原理实现的
2.切换到异步线程是通过eventbus里面默认的线程池实现的Executors.newCachedThreadPool();
3.切换到后台线程也是通过线程池执行的,backgroundPoster执行事件也是在eventBus.getExecutorService()的线程池的线程里面,直到当前队列里面事件执行完成之前,不会开启新的线程来执行事件,事件的执行过程是串联起来的.也可以理解为事件是分批次来执行的,不同批次会开不同的线程执行,同一批次里面的事件在同一个线程里面按照串联顺序依次执行
五、粘性事件(stick事件)所谓的粘性事件就是可以给为启动的Activity发送事件
原理是在post的时候调用poststick方法 poststick会这个事件保存在 stickyEvents的map集合中,并把这个时间当成普通事件发送
在register的时候会遍历stickyEvents 查看是否有stick事件 有就执行一下。

你可能感兴趣的:(阅读eventbus源码笔记)