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


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

我在RxJava中有一些接近这个设置的东西 AsyncSubject。观察者从主题中获得单个事件,但随后他们得到了一个 onComplete 事件和取消订阅。这首先加载UI,但是当需要刷新数据时,不会通知订阅者。我怎么告诉他们 Subscribers 继续倾听更多 onNext 来自的事件 Subject

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

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

12366
2017-07-23 18:37


起源



答案:


一个稍晚的答案,但对于你的情节来说,一个比BehaviorSubject更好的选择可能是来自的行为 RxRelay lib。当您需要不同的行为但希望在您可以使用的所有模块之间共享单点交互时,还可以获得更全面的解决方案 RxHub


4
2017-09-15 17:03





BehaviorSubject 将满足您的需求。 https://github.com/Netflix/RxJava/wiki/Subject#behaviorsubject

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


8
2017-07-23 21:57



我最终使用了 BehaviorSubject,但我使用内部观察者只在父Observable执行时调用onNext(),忽略任何onComplete事件以保持流打开。更多信息: groups.google.com/forum/#!topic/rxjava/2bNl14lIjRo - Austyn Mahoney
在您的情况下,忽略onComplete是必要的。我应该在我的回答中提到这一点,但在我发布的链接中清楚地解释了这一点。 - tomrozb


答案:


一个稍晚的答案,但对于你的情节来说,一个比BehaviorSubject更好的选择可能是来自的行为 RxRelay lib。当您需要不同的行为但希望在您可以使用的所有模块之间共享单点交互时,还可以获得更全面的解决方案 RxHub


4
2017-09-15 17:03





BehaviorSubject 将满足您的需求。 https://github.com/Netflix/RxJava/wiki/Subject#behaviorsubject

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


8
2017-07-23 21:57



我最终使用了 BehaviorSubject,但我使用内部观察者只在父Observable执行时调用onNext(),忽略任何onComplete事件以保持流打开。更多信息: groups.google.com/forum/#!topic/rxjava/2bNl14lIjRo - Austyn Mahoney
在您的情况下,忽略onComplete是必要的。我应该在我的回答中提到这一点,但在我发布的链接中清楚地解释了这一点。 - tomrozb


我认为如果将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);
  }
}

什么时候应该使用RxJava Observable和Android上的简单回调?


3
2017-08-23 15:15