12

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

我在 RxJava 中使用AsyncSubject. 观察者从主题中得到一个事件,然后他们得到一个onComplete事件并取消订阅。这在 UI 第一次加载时起作用,但是当需要刷新数据时,不会通知订阅者。我如何告诉那些Subscribers继续收听onNext来自 的更多事件Subject

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

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

3 回答 3

8

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

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

于 2014-07-23T21:57:17.393 回答
5

比 BehaviorSubject 稍微晚一点的答案,但比 BehaviorSubject 更好的方案可能是RxRelay lib的 BehaviorRelay 。当您需要不同的行为但希望在所有模块之间共享单点交互时,您可以使用RxHub来获得更多全局解决方案

于 2016-09-15T17:03:23.770 回答
3

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

switchOnNext() 将一个发出 Observables(本例中为 BehaviorSubject)的 Observable 转换为一个单独的 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 上使用简单的 Callback?

于 2014-08-23T15:15:00.377 回答