对eventBus的理解

eventbus最早主要是通过注解方式实现的,最新的3.0版本主要是通过注解处理器来实现的,在代码的编译阶段产生模板类来提高运行效率,生成的模板代码一般在项目的generated目录下的source目录下apt目录可以看到模板代码,下面代码来自:(http://blog.csdn.net/u011240877/article/details/73196808)

public class MyEventBusIndex implements SubscriberInfoIndex {    //实现了前面提到的接口
    private static final Map<Class<?>, SubscriberInfo> SUBSCRIBER_INDEX;    //保存类和订阅信息的缓存表

    static {
        SUBSCRIBER_INDEX = new HashMap<Class<?>, SubscriberInfo>();

        //记录每个类中的订阅方法信息
        putIndex(new SimpleSubscriberInfo(net.sxkeji.shixinandroiddemo2.activity.eventbus.EventBusRegisterActivity.class,
                true, new SubscriberMethodInfo[] {
            new SubscriberMethodInfo("readMessageFirst",
                    net.sxkeji.shixinandroiddemo2.activity.eventbus.MessageEvent.class, ThreadMode.POSTING, 5, false),
            new SubscriberMethodInfo("readMessage", net.sxkeji.shixinandroiddemo2.activity.eventbus.MessageEvent.class,
                    ThreadMode.POSTING, 1, false),
        }));

        putIndex(new SimpleSubscriberInfo(net.sxkeji.shixinandroiddemo2.activity.eventbus.EventBusStickyActivity.class,
                true, new SubscriberMethodInfo[] {
            new SubscriberMethodInfo("readStickyMsg",
                    net.sxkeji.shixinandroiddemo2.activity.eventbus.MessageEvent.class, ThreadMode.MAIN, 0, true),
        }));

    }

    private static void putIndex(SubscriberInfo info) {
        SUBSCRIBER_INDEX.put(info.getSubscriberClass(), info);
    }

    @Override
    public SubscriberInfo getSubscriberInfo(Class<?> subscriberClass) {
        SubscriberInfo info = SUBSCRIBER_INDEX.get(subscriberClass);
        if (info != null) {
            return info;
        } else {
            return null;
        }
    }
}

可以看到,里面根据注册eventbus的类生成了代码,里面主要有一个map,存储注册的Class对象以及其中所有的订阅方法,这样我们在post事件的时候可以很容易的根据Class对象获取该类中订阅的所有方法,然后根据事件类型来通知所注册的方法来进行响应。

发送事件的源代码

private void postSingleEvent(Object event, PostingThreadState postingState) throws Error {
    Class<?> eventClass = event.getClass();
    boolean subscriptionFound = false;
    if (eventInheritance) {
        List<Class<?>> eventTypes = lookupAllEventTypes(eventClass);    //找到这个事件的所有父类和接口
        int countTypes = eventTypes.size();
        for (int h = 0; h < countTypes; h++) {
            Class<?> clazz = eventTypes.get(h);
            subscriptionFound |= postSingleEventForEventType(event, postingState, clazz);
        }
    } else {
        subscriptionFound = postSingleEventForEventType(event, postingState, eventClass);
    }
    if (!subscriptionFound) {   //如果没有订阅者,调用失败,根据配置,抛出一个 NoSubscriberEvent 事件
        if (logNoSubscriberMessages) {
            Log.d(TAG, "No subscribers registered for event " + eventClass);
        }
        if (sendNoSubscriberEvent && eventClass != NoSubscriberEvent.class &&
                eventClass != SubscriberExceptionEvent.class) {
            post(new NoSubscriberEvent(this, event));
        }
    }
}

根据发送的事件类型,找出所有订阅该事件的类以及接口,然后遍历每一个类,去回调订阅该事件的每一个方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,603评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,268评论 19 139
  • 对于Android开发老司机来说肯定不会陌生,它是一个基于观察者模式的事件发布/订阅框架,开发者可以通过极少的代码...
    飞扬小米阅读 1,495评论 0 50
  • 夜凉如水 都道宫中繁华,可有一个地方,却是森森如阴,不知是因为故去了太多的如花容颜,还是消磨了无数殷红的期待?夜袭...
    月懒西楼阅读 718评论 6 7
  • 天使在人间 当我们呱呱落地的时候 有一个放心不下的小天使,陪伴我们来到人间 当我们睁着一双大大的眼睛,开始看世界的...
    青苗妈2016阅读 223评论 0 0