EventBus工作流程


# 1.实现订阅者类
public class SampleSubscriber {

public void onEvent(Event event) {
// do something while on event occur
}
}


# 2.初始化一个EventBus
EventBus.getDefault();


# 3.注册订阅者 (subscribe)


EventBus.getDefault().register(new SampleSubscriber());


List<SubscriberMethod> SubscriberMethodFinder.findSubscriberMethods(Class<?> subscriberClass)
SubscriberMethod:
包含订阅者Method引用,消息类型Class,线程模式枚举变量


遍历上句中的列Method列表进行注册
EventBus.subscribe(Object subscriber, SubscriberMethod subscriberMethod, boolean sticky, int priority)


存储消息类型与订阅的映射 Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventType


subscriptions = new CopyOnWriteArrayList<Subscription>();
subscriptionsByEventType.put(eventType, subscriptions);
根据订阅的优先级添加新订阅
int size = subscriptions.size();
for (int i = 0; i <= size; i++) {
    if (i == size || newSubscription.priority > subscriptions.get(i).priority) {
        subscriptions.add(i, newSubscription);
        break;
    }
}


存储订阅者与消息类型的映射Map<Object, List<Class<?>>> typesBySubscriber
List<Class<?>> subscribedEvents = typesBySubscriber.get(subscriber);
if (subscribedEvents == null) {
    subscribedEvents = new ArrayList<Class<?>>();
    typesBySubscriber.put(subscriber, subscribedEvents);
}
subscribedEvents.add(eventType);


Map<Class<?>, Object> stickyEvents
最后判断是否是针对sticky消息的订阅者,并且有sticky的该类型的消息存在,则完成注册后直接检查是否队列中有该消息,有则直接向该订阅者发送消息




4.发布信息 (post)
分为四种
PostThread
MainThread
BackgroundThread
Async


处理堆栈
取出消息队列,并从消息队列中取出事件,将事件与当前的postState一起交给postSingleEvent处理
EventBus.postSingleEvent(Object event, PostingThreadState postingState)
该方法中处理是否有继承关系
EventBus.postSingleEventForEventType(Object event, PostingThreadState postingState, Class<?> eventClass)
该方法中根据事件取得对应的订阅者
EventBus.postToSubscription(Subscription subscription, Object event, boolean isMainThread)
该方法中根据postState判断onEvent所在的线程类型
EventBus.invokeSubscriber(Subscription subscription, Object event)
该方法做最终的调用处理
除PostThread类型或PostThread就是MainThread/BackgroundThread外,其他三种都由各自的Poster完成


# 3种Poster
mainThreadPoster由HandlerPoster完成功能,继承自Handler
backgroundPoster和asyncPoster都通过实现Runnable完成功能backgroundPoster是asyncPoster的一种特殊形式,是一个单一的队列。
asyncPoster则可能有多个同时执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值