EventBus源码的理解

10 篇文章 0 订阅

EventBus的作用与用途网上很多,这里就不多做概述。为了不成为一个知其然不知所以然的人,找了段时间,阅读了EventBus的源码,下面做下简单的介绍:

EventBus的控制器是EventBus类,subscriber首先需要在EventBus上register:

 private synchronized void register(Object subscriber, boolean sticky, int priority) {
        List<SubscriberMethod> subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriber.getClass());
        for (SubscriberMethod subscriberMethod : subscriberMethods) {
            subscribe(subscriber, subscriberMethod, sticky, priority);
        }
    }

在这里,主要是findSubscriberMethods方法,它通过subscriber的反射,找到它需要回调的函数,是以onEvent..开头的:

  private static final String ON_EVENT_METHOD_NAME = "onEvent";

这些函数至少要有一个参数,而且第一个参数必须是事件类型,这样才能通过事件类型找到订阅者:

String methodKey = methodKeyBuilder.toString();
if (eventTypesFound.add(methodKey)) {
            // Only add if not already found in a sub class
             subscriberMethods.add(new SubscriberMethod(method, threadMode, eventType));
 }

通过注册就在EventBus上有了一个事件类型-订阅者的映射关系也就是map,在这里要说下,这个表可能不是最新的,因为:

 synchronized (methodCache) {
          subscriberMethods = methodCache.get(key);
  }
   if (subscriberMethods != null) {
           return subscriberMethods;
   }

而且有了注册就必须unRegister,否则会报错。

最后讲讲EventBus是怎么Post的:

/** Posts the given event to the event bus. */
    public void post(Object event) {
        PostingThreadState postingState = currentPostingThreadState.get();
        List<Object> eventQueue = postingState.eventQueue;
        eventQueue.add(event);

        if (!postingState.isPosting) {
            postingState.isMainThread = Looper.getMainLooper() == Looper.myLooper();
            postingState.isPosting = true;
            if (postingState.canceled) {
                throw new EventBusException("Internal error. Abort state was not reset");
            }
            try {
                while (!eventQueue.isEmpty()) {
                    postSingleEvent(eventQueue.remove(0), postingState);
                }
            } finally {
                postingState.isPosting = false;
                postingState.isMainThread = false;
            }
        }

首先是把事件类型放到事件队列中,再取出第一个,并且判断该事件Post的时候在哪个线程,比如UI线程,如果 是UI线程的话OnEventMainThread就会执行,OnEventThread也会执行,如果不是的话,OnEventMainThread就不会执行,OnEventThread会执行,另外两种类型是跟OnEventMainThread同样的道 理,看是否属于需要。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值