翻譯:通過 RxJava 實現一個 Event Bus -RxBus

jopen 9年前發布 | 70K 次閱讀 RxJava Android開發 移動開發

 

原文: Implementing an Event Bus With RxJava – RxBus

這篇文章有三個部分:

  1. 關于什么是 Event Bus(事件總線)的快速指引(不譯)
  2. 通過 RxJava 實現一個 RxBus
  3. 對于文章所題的這種方式的一些疑惑和回答

一、什么是 Event Bus(事件總線)

這部分由于篇幅太長,并且不是關鍵,所以略去,關于這部分,我假設你已經懂得了,如果不懂,可以看看 Square 的 Otto 或者 GreenRobot 的 EventBus,再或者你可以看看 妹紙&gank.io 的源代碼,這個項目使用到了 Otto 和 RxJava。

二、通過 RxJava 實現一個 RxBus

我已經發布了這個 使用 RxJava 的例子了: 一個使用 RxJava for Android 的教程 ,所以我在這里繼續來解釋 RxBus 的完整實現。這是其中有趣部分的實現:

// 這是作為中間人調用的對象
public class RxBus {

  private final Subject<Object, Object> _bus = new SerializedSubject<>(PublishSubject.create());

  public void send(Object o) {
    _bus.onNext(o);
  }

  public Observable<Object> toObserverable() {
    return _bus;
  }
}

這樣就可以了,看得出我們已經有一個 Event Bus 可以使用啦,接下來就是使用方式的介紹:

通過這個 bus 發布一個事件:

@OnClick(R.id.btn_demo_rxbus_tap)
public void onTapButtonClicked() {

    _rxBus.send(new TapEvent());
}

在其他 Fragment 或者 Service 等地方監聽這個事件:

// 注意 要使用原本發布這個事件的那個 bus 實例才行
_rxBus.toObserverable()
    .subscribe(new Action1<Object>() {
      @Override
      public void call(Object event) {

        if(event instanceof TapEvent) {
          _showTapText();

        }else if(event instanceof SomeOtherEvent) {
          _doSomethingElse();
        }
      }
    });

在這個例子中,我們在綠色部分的 Frgament 中發布了一個點擊事件,然后在藍色部分的 Fragment 中監聽響應這個事件。

三、對文章所題的這種方式的一些疑惑和回答

關于 Dead events,以及 RxBus 要怎么實現這點?

我們如果能夠知道是否有觀察者目前訂閱了我們的 bus,在有些情況下是很有用的。例如,你使用一個 Event Bus 來處理 GCM 的推送通知,當你的 App 當前正在前臺運行的時候,你不想發送通知欄通知,這時監聽這個 “ DeadEvent ” 就很重要了。(譯者注:來源于 Otto 中對于 DeadEvent 的用處解釋:用來包裝一個沒有訂閱者的事件,它不會被交付。)

例如,在我們最新發布的一個 App 中,我們增加了一個“發送中”的功能。當用戶打開我們的 App 在使用,這時會有許多監聽器正在監聽這個 bus,我們不需要發送 通知欄消息,當我們的 App 在后臺的時候,我們需要發送 通知欄消息 讓用戶獲得一些聊天信息。當一個事件發布,如果沒有訂閱者在監聽(注:如果應用或頁面到了后臺或者關閉,一些和生命周期掛鉤的訂閱,都會解除對事件的監聽,所以這時可以說沒有訂閱者在監聽啦),就發布一個 dead event。如果我們發出一個 dead event,推送通知欄消息就可以出現了。

那么 RxBus 要怎么實現這點?

事實上十分簡單,在 1.x 版本的 RxJava 中有了一個很有用的方法:hasObservers(),使用這個方法就可以做到啦。

那么我是否應該使用 RxBus 來替代 Otto/EventBus?

如果你只是想簡單地使用一個 Event Bus,你最好還是使用 Otto(特別推薦)或者 EventBus。Otto 通過注解可以有很清爽的 API,并且它使用起來也比較簡單。

而如果你對 Rx 很熟悉,并且已經在你的項目中使用了 RxJava,同時你又想避免使用更多的依賴庫,那么肯定說要試試我們的 RxBus 了!

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!