eventbus 源码分析

目前项目里用到了较多的eventbus来传递,接收收据,所以今天就花了点时间整理了一下eventbus执行流程

本文主要分析eventbus 里的几个比较重要方法

1 ,eventbus.getdefault

获取一个单例对象


2,eventbus.getdefault.register()

//获取当前注册的类

Class subscriberClass = subscriber.getClass();

获取我们在当前类定义的接收eventbus方法列表

List subscriberMethods =subscriberMethodFinder.findSubscriberMethods(subscriberClass);

这个方法具体实现

首先 METHOD_CACHE是一个 hashmap ,它里面缓存了我们已经注册过的的类定义的接收方法列表,避免重复获取

第一次进来则会获取我们定义的接收事件方法列表


这个方法首先是创建一个新的FindState类,通过两种方法获取,一种是从FIND_STATE_POOL即FindState池中取出可用的FindState,如果没有的话,则通过第二种方式:直接new一个新的FindState对象。FindState类是SubscriberMethodFinder的内部类,这个方法主要做一个初始化的工作。这里由于初始化的时候,findState.subscriberInfo和subscriberInfoIndexes为空,所以这里会调用findUsingReflectionInSingleClass(findState);

方法,这个方法最终会获取到我们定义接收消息类的方法列表(主要代码)


// This is faster than getMethods, especially when subscribers are fat classes like Activities 

,反射获取们当前注册类的自己声明的方法列表

    methods = findState.clazz.getDeclaredMethods();

  //遍历方法列表

  for (Method method : methods) {

  int modifiers = method.getModifiers();

  if ((modifiers & Modifier.PUBLIC) !=0 && (modifiers &MODIFIERS_IGNORE) ==0) {

        //获取当前方法的参数列表

        Class[] parameterTypes = method.getParameterTypes();

        //这里判断等于1 说明我们定义的接收方法的参数只能有1个

        if (parameterTypes.length ==1) {

            //获取当前方法是否有@subscribe 注解

            Subscribe subscribeAnnotation = method.getAnnotation(Subscribe.class);

            if (subscribeAnnotation !=null) {

            eventType = parameterTypes[0];

            if (findState.checkAdd(method, eventType)) {

                ThreadMode threadMode = subscribeAnnotation.threadMode();

                //获取方法的threadmode等属性,并创建一个SubscriberMethod 添加ArrayList中

                findState.subscriberMethods.add(new SubscriberMethod(method, eventType, threadMode,

                subscribeAnnotation.priority(), subscribeAnnotation.sticky()));

            }

    }

    ...

}

好了,我们定义的接收方法列表获取到了,在看register接下来的逻辑

遍历刚刚获取的方法列表,调用subscribe方法,这是subscribe方法前半段

这段代码主要是 以方法参数的类型class为key,以list 为value将其添加到subscriptionsByEventType这个hashmap中

下面的typesBySubscriber也是一个hashmap ,它是以当前类为key,以方法参数的类型class为value,这个hashmap主要是判断当前event是否注册


        这个是subscribe方法后半部分,主要针对的是stickyevent,我们看到后面会调用checkPostStickyEventToSubscription(newSubscription, stickyEvent);这个方法,而这个方法最终会调用下面这个方法

这个方法就是去执行subscription里的method

            这里说明我们在发送stickyevent的时候,相应的sticky方法会在当前类的eventbus注册的时候调用

             到这里eventbus注册就执行完了

3 eventbus.getdefault.post()               eventbus发送消息

    post方法会调用  postSingleEvent(eventQueue.remove(0), postingState);        方法,然后再调用 postSingleEventForEventType(event, postingState, eventClass);方法,再看这个方法


      首先这个subscriptionsByEventType(hashmap)是刚刚注册的时候保存的方法列表,获取到我们要发送的event之后会调用postToSubscription(subscription, event, postingState.isMainThread);方法,这个方法就是去执行subscription里的method.

自此,eventbus基本执行流程也就结束了

你可能感兴趣的:(eventbus 源码分析)