美文网首页
对eventBus的理解

对eventBus的理解

作者: camlboy | 来源:发表于2017-09-05 21:52 被阅读20次

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));
        }
    }
}

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

相关文章

  • 对eventBus的理解

    eventbus最早主要是通过注解方式实现的,最新的3.0版本主要是通过注解处理器来实现的,在代码的编译阶段产生模...

  • EventBus源码学习笔记

    前言 最近阅读了EventBus(3.0.0)的源码,这里也是记录下自己对EventBus的理解,功力善浅,如有错...

  • EventBus学习笔记

    如果对EventBus原理不太熟悉的童鞋可以看这个: EventBus 原理解析 1.极其简单的订阅-发布-接收模...

  • 对于EventBus的再次理解

    一、对于EventBus的再次理解:①EventBus.getDefault().postSticky(new U...

  • EventBus的理解

    一、Event的注册 使用方式: 所做的事情: 保存当前订阅类所订阅的所有事件类型,保存每种事件类型对应的Subs...

  • EventBus 3.1.1 自己对源码的理解

    一:使用步骤 1、eventbus3.1.1版本依赖: 2、在 Activity 或 Fragment 中进行注册...

  • EventBus之3.0的使用

    一:EventBus简介 讲解怎么EventBus怎么用之前,先说说这玩意是干什么的。EventBus在我的理解中...

  • EventBus 源码分析

    EventBus原理解析 1. 注册EventBus 将一个类注册为事件的订阅者分两步 EventBus.getD...

  • EventBus源码理解

    EventBus源码理解 EventBus是我们在开发中经常使用的开源库,使用起来比较简单,而且源码看起来不是很吃...

  • EventBus初理解

    缘由: 平时工作,因为懒于动笔的原因,也没注重技术和经验的积累,导致之前曾经研究过的问题现在又忘记了,所以要慢慢注...

网友评论

      本文标题:对eventBus的理解

      本文链接:https://www.haomeiwen.com/subject/llmpjxtx.html