EventBus使用詳解

EventBus是一款針對Android優化的發佈/訂閱事件總線。主要功能是替代Intent、Handler、BroadCast在Fragment、Activity、Service、線程之間傳遞消息.優勢是開銷小,代碼更優雅。以及將發送者和接收者解耦。EventBus在GitHub上的開源庫地址,剛開始使用的能夠看一下,GitHub上有最基本的使用方法。java

EventBus引用

最基本的引用以下:android

 compile 'org.greenrobot:eventbus:3.1.1'
複製代碼

添加這個引用以後就可使用EventBus了,可是EventBus更新3.1.1以後採用了註解的方式,接收的函數名能夠自定義,可是傳遞效率就不是很高了,所以須要加速處理,固然,也能夠不使用註解和加速,加速引用以下:git

//defaultConfig 下加入代碼
defaultConfig{
   javaCompileOptions {
          annotationProcessorOptions {
              arguments = [eventBusIndex: 'com.yz.ui.fragmentdemo.MyEventBusIndex']
          }
     }
}

//dependencies 下加入代碼
dependencies{
  annotationProcessor 'org.greenrobot:eventbus-annotation-processor:3.0.1'
}
複製代碼

注意:javaCompileOptions這裏是生成加速配置文件,MyEventBusIndex就是生成文件的名字,前面就是你的包名,編譯以後能夠查看:github

EventBus配置

這一步驟沒有也同樣可使用,只是有一些需求能夠在這裏配置,如:加速、設置debug模式下要拋出異常等app

//修改默認實現的配置,記住,必須在第一次EventBus.getDefault()以前配置,且只能設置一次。建議在application.onCreate()調用
EventBus.builder().throwSubscriberException(BuildConfig.DEBUG).addIndex(new MyEventBusIndex()).installDefaultEventBus();
// 這樣每次獲取到默認實例,都是使用Subscriber Index的了,代碼獲得了精簡。
EventBus eventBus = EventBus.getDefault();
複製代碼

EventBus使用

定義EventBus事件類
public class MessageEvent {

    private Object msg;

    public MessageEvent(Object msg) {
        this.msg = msg;
    }

    public Object getMsg() {
        return msg;
    }

    public void setMsg(Object msg) {
        this.msg = msg;
    }

    @Override
    public String toString() {
        return "MessageEvent{" +
                "msg=" + msg +
                '}';
    }
}

複製代碼

注意:這裏我是用Object類型是爲了傳遞各類類型的數據,使這個事件類變成通用的事件類,若是你的事件須要同時存在可在該類中加入一個標識來區別本身的事件。異步

註冊/註銷EventBus
EventBus.getDefault().register(this);//註冊

EventBus.getDefault().unregister(this);//註銷
複製代碼

注意:官方是推薦將註冊寫到onStart,將註銷寫到onStop中,固然你也能夠更具本身的需求來改變的ide

發佈訂閱事件
  • 普通的事件發送
EventBus.getDefault().post(new MessageEvent("發送事件"));
複製代碼

注意:EventBus是爲了給已經存在的窗體傳遞信息,並且訂閱者必需要註冊且不能被註銷了,不然接收不到消息函數

  • 粘性的事件發送
 EventBus.getDefault().postSticky(new MessageEvent("發送粘性事件"));
複製代碼

注意:粘性的事件發送後只要不取消會一直存在工具

訂閱事件處理

在接收數據須要處理事件的窗體中定義訂閱事件處理函數:post

 @Subscribe(threadMode = ThreadMode.POSTING, priority = 2, sticky = true)
 public void onMessageEventPost(MessageEvent data) {

 }
複製代碼

注意:threadMode指線程模式,priority指事件的優先級,sticky是不是粘性事件

  • threadMode 線程模式有四種:NAIN UI主線程、BACKGROUND 後臺線程、POSTING 和發佈者處在同一個線程、ASYNC 異步線程 不寫註解默認爲POSTING模式,具體介紹 threadMode
  • priority 其實和Boardcast接收者的優先級差很少,數越大優先級越高,通常0-100。默認爲0
  • sticky 在註冊期間,全部粘性訂戶方法將當即得到以前發佈的粘性事件
刪除事件
  • 普通事件刪除
 EventBus.getDefault().cancelEventDelivery(event);
複製代碼

注意:事件取消僅限於ThreadMode.PostThread下才可使用

  • 粘性事件刪除
//指定粘性事件刪除
  T stickyEvent = EventBus.getDefault().getStickyEvent(eventType);
  if (stickyEvent != null) {
      EventBus.getDefault().removeStickyEvent(stickyEvent);
  }
//刪除全部粘性事件
 EventBus.getDefault().removeAllStickyEvents();
複製代碼

EventBus封裝工具類以下:

/**
 * 殘夢  EventBus事件處理
 * <p>
 * EventBus是爲了給已經存在的窗體傳遞信息,並且訂閱者必需要註冊且不能被註銷了,不然接收不到消息
 * 給還未建立的窗體傳遞信息須要用粘性事件
 * <p>
 * Created by dell on 2018/1/26.
 */

public class EventBusUtils {

    private static final String TAG = EventBusUtils.class.getSimpleName();

    /**
     * 控制日誌在開發的時候輸出,發佈的時候不輸出,在開發的時候錯誤崩潰,而發佈的時候不崩潰
     * 打開加速
     */
    public static void openIndex() {
        //修改默認實現的配置,記住,必須在第一次EventBus.getDefault()以前配置,且只能設置一次。建議在application.onCreate()調用
        EventBus.builder().throwSubscriberException(BuildConfig.DEBUG).addIndex(new MyEventBusIndex()).installDefaultEventBus();
        // 這樣每次獲取到默認實例,都是使用Subscriber Index的了,代碼獲得了精簡。
        EventBus eventBus = EventBus.getDefault();
    }


    /**
     * 註冊EventBus
     *
     * @param subscriber 訂閱者
     */
    public static void register(Object subscriber) {
        if (!EventBus.getDefault().isRegistered(subscriber)) {
            EventBus.getDefault().register(subscriber);
        }
    }

    /**
     * 注消EventBus
     *
     * @param subscriber 訂閱者
     */
    public static void unregister(Object subscriber) {
        EventBus.getDefault().unregister(subscriber);
    }

    /**
     * 發佈訂閱事件
     *
     * @param Publisher 發佈者
     */
    public static void post(Object Publisher) {
        EventBus.getDefault().post(Publisher);
    }

    /**
     * 發佈粘性訂閱事件
     *
     * @param Publisher 發佈者
     */
    public static void postSticky(Object Publisher) {
        EventBus.getDefault().postSticky(Publisher);
    }


    /**
     * 移除指定的粘性訂閱事件
     *
     * @param eventType 移除的內容
     * @param <T>
     */
    public static <T> void removeStickyEvent(Class<T> eventType) {
        T stickyEvent = EventBus.getDefault().getStickyEvent(eventType);
        if (stickyEvent != null) {
            EventBus.getDefault().removeStickyEvent(stickyEvent);
        }
    }

    /**
     * 取消事件傳送 事件取消僅限於ThreadMode.PostThread下才可使用
     * 不取消事件就會一直存在
     *
     * @param event
     */
    public static void cancelEventDelivery(Object event) {
        EventBus.getDefault().cancelEventDelivery(event);
    }

    /**
     * 移除全部的粘性訂閱事件
     */
    public static void removeAllStickyEvents() {
        EventBus.getDefault().removeAllStickyEvents();
    }
複製代碼
相關文章
相關標籤/搜索