由淺入深瞭解EventBus:(二)

概念

 深刻學習EventBus框架,就必須理解EventBus的相關原理和一些概念;java

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:開闢一個新的線程,用來執行比較耗時的操做,好比網絡訪問,數據庫訪問;this

SubscriberMethod

 SubscriberMethod類是EventBus3.0框架內部存儲消息處理方法相關信息的類;spa

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框架內部使用反射機制;code

  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;
    }
}
相關文章
相關標籤/搜索