用RxJava替换EventBus - N个用户总是在听

时间:2014-07-23 18:37:36

标签: android rx-java

我正在Android应用中用EventBus替换RxJava模式。我有事件提醒任何感兴趣的各方我的缓存单例中的数据更新。每次调用Web服务时,都会更新数据,并通过发布的事件提醒订阅者。

我在RxJava中使用AsyncSubject接近此设置。观察者从主题中获得单个事件,但随后他们获得onComplete事件并取消订阅。这首先加载UI,但是当需要刷新数据时,不会通知订阅者。如何告诉那些Subscribers继续倾听来自onNext的更多Subject个事件?

我需要Subject来报告最近的项目。 PublishSubject仅在订阅后发出项目,因此不能满足我的需求。我的订阅者在不同的时间(可能在第一个数据事件之后)开始观察,因此我需要主题发出最后观察的项目,然后保持流为后续项目打开。似乎AsyncSubject和PublishSubject的组合就是我所需要的。有没有办法用内置类来完成这个,或者我是否需要创建自己的主题?

WebServiceObservable OR CacheObservable
                  ^
                  |
             AsyncSubject
                  ^
                  |
                /   \
              /       \
            /           \
      UiObserver1   UiObserver2

3 个答案:

答案 0 :(得分:8)

BehaviorSubject符合您的需求。 https://github.com/Netflix/RxJava/wiki/Subject#behaviorsubject

如果您需要更复杂的行为,您可以随时编写自己的Subject实施。这样做似乎非常简单。

答案 1 :(得分:5)

稍微晚一些的回答,但对于你的情绪来说,一个比行为主题更好的选择可能是来自RxRelay lib的BehaviorRelay。当您需要不同的行为但希望在所有模块之间共享单点交互时,您也可以使用RxHub

来获得更全面的解决方案

答案 2 :(得分:3)

我认为如果将BehaviorSubject与switchOnNext运算符一起使用会更简单。

switchOnNext( ) 将发出Observables的Observable(本例中为BehaviorSubject)转换为单个Observable,该Observable发出最近发出的Observables发出的项目

switchOnNext()返回的Observable来自先前发出的Observable的取消订阅开始从最新的Observable中发出项目

public class PhotoModel{
  BehaviorSubject<Observable<Photo>> subject = BehaviorSubject.create(...);

  public void setUserId(String id){
   subject.onNext(Api.getUserPhoto(photoId));
  }

  public Observable<Photo> subscribeToPhoto(){
    return Observable.switchOnNext(subject);
  }
}

When should one use RxJava Observable and when simple Callback on Android?