zoukankan      html  css  js  c++  java
  • 由浅入深了解EventBus:(二)

    概念

     深入学习EventBus框架,就必须理解EventBus的相关原理和一些概念;

    Subscribe

     在EventBus框架中,消息的处理接收方法必须要“@Subscribe”注解来进行标注;

    public @interface Subscribe {
        ThreadMode threadMode() default ThreadMode.POSTING;
        boolean sticky() default false;
        int priority() default 0;
    }
    

        从Subscribe源码中可以看出,有三个相关的实现,其中sticky 是来标注是否是粘性事件,默认是false,priority 是权重,priority 值越大级别越高,是来EventBus框架内部进行排序用的字段,最重要的ThreadMode 是指消息处理方法运行在哪个线程中;ThreadMode是个枚举类型:POSTING,MAIN,BACKGROUND,ASYNC;

    ThreadMode.POSTING:默认值,消息处理方法被调用时所在的线程中执行,避免了线程间的切换,性能开销也最小;

    ThreadMode.MAIN:消息处理方法必须在主线程也就是UI线程中执行;

    ThreadMode.BACKGROUND:消息处理方法在后台线程中执行;

    ThreadMode.ASYNC:开辟一个新的线程,用来执行比较耗时的操作,比如网络访问,数据库访问;

    SubscriberMethod

     SubscriberMethod类是EventBus3.0框架内部存储消息处理方法相关信息的类;

    public class SubscriberMethod {
        final Method method;
        final ThreadMode threadMode;
        final Class<?> eventType;
        final int priority;
        final boolean sticky;
        String methodString;
    }
    

     SubscriberMethod类中的各个字段都是用来对消息处理方法的描述;

      method:消息处理方法中方法描述,通过Method类我们可以看出其实在EventBus3.0框架内部使用反射机制;

      threadMode:对应的就是消息处理方法中的注解“Subscribe”中的ThreadMode 枚举;

      eventType:对应的就是消息处理方法中的参数类型,也就是我们定义的消息处理类;

      priority:对应的就是消息处理方法中的注解“Subscribe”中的priority 枚举;

      sticky :对应的就是消息处理方法中的注解“Subscribe”中的sticky 枚举;

     其实在EventBus3.0框架内部,当注册/订阅一个事件时,框架内部会将消息处理方法转换为SubscriberMethod类,存储在框架的内部;

     SubscriberInfo

      SubscriberInfo 在EventBus3.0框架内部是一个接口,该接口的目的就是获取订阅类中的SubscriberMethod类的相关信息;

    public interface SubscriberInfo {
        Class<?> getSubscriberClass();//获取订阅类的类型
    
        SubscriberMethod[] getSubscriberMethods();//获取SubscriberMethod类的集合
    
        SubscriberInfo getSuperSubscriberInfo();
    
        boolean shouldCheckSuperclass();//是否检测基类
    }
    

    Subscription

    Subscription类存储的就是订阅者与消息处理方法的类,该类很简单,就3个字段,一个存储的是订阅者的实体类,一个是存储的消息处理方法的SubscriberMethod;
    final class Subscription {
        final Object subscriber;
        final SubscriberMethod subscriberMethod;
        volatile boolean active;
    
        Subscription(Object subscriber, SubscriberMethod subscriberMethod) {
            this.subscriber = subscriber;
            this.subscriberMethod = subscriberMethod;
            active = true;
        }
    }
    

      

      

  • 相关阅读:
    hdoj 4006 The kth great number【优先队列】
    hdoj 1509 Windows Message Queue【优先队列】
    nyoj 55 懒省事的小明【优先队列】
    hdoj 1896 Stones【优先队列】
    nyoj 757 期末考试【优先队列+贪心】
    hdoj 2147 kiki's game【博弈】
    hdoj 1873 看病要排队【优先队列】
    hdoj 1789 Doing Homework again
    nyoj 1036 非洲小孩【贪心区间选点】
    转:栈和队列小知识【STL用法】
  • 原文地址:https://www.cnblogs.com/h20064528/p/6763018.html
Copyright © 2011-2022 走看看