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<subscription> 为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基本执行流程也就结束了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前面对EventBus 的简单实用写了一篇,相信大家都会使用,如果使用的还不熟,或者不够6,可以花2分钟瞄一眼:h...
    gogoingmonkey阅读 2,571评论 0 0
  • EventBus源码分析(二) 在之前的一篇文章EventBus源码分析(一)分析了EventBus关于注册注销以...
    蕉下孤客阅读 5,630评论 0 10
  • 简介 前面我学习了如何使用EventBus,还有了解了EventBus的特性,那么接下来我们一起来学习EventB...
    eirunye阅读 3,262评论 0 0
  • EventBus源码分析(一) EventBus官方介绍为一个为Android系统优化的事件订阅总线,它不仅可以很...
    蕉下孤客阅读 9,445评论 4 42
  • EventBus是在Android中使用到的发布-订阅事件总线框架,基于观察者模式,将事件的发送者和接收者解耦,简...
    BrotherTree阅读 3,110评论 0 1

友情链接更多精彩内容