我正在取代一个 EventBus
模式 RxJava
在Android应用中。我有事件提醒任何感兴趣的各方我的缓存单例中的数据更新。每次调用Web服务时,都会更新数据,并通过发布的事件提醒订阅者。
我在RxJava中有一些接近这个设置的东西 AsyncSubject
。观察者从主题中获得单个事件,但随后他们得到了一个 onComplete
事件和取消订阅。这首先加载UI,但是当需要刷新数据时,不会通知订阅者。我怎么告诉他们 Subscribers
继续倾听更多 onNext
来自的事件 Subject
?
我需要一个 Subject
这将报告最近的项目。 PublishSubject
只在订阅后发出项目,因此它不能满足我的需求。我的订阅者在不同的时间(可能在第一个数据事件之后)开始观察,因此我需要主题发出最后观察的项目,然后保持流为后续项目打开。似乎AsyncSubject和PublishSubject的组合就是我所需要的。有没有办法用内置的类来实现这一点,还是我需要创建自己的主题?
WebServiceObservable OR CacheObservable
^
|
AsyncSubject
^
|
/ \
/ \
/ \
UiObserver1 UiObserver2
一个稍晚的答案,但对于你的情节来说,一个比BehaviorSubject更好的选择可能是来自的行为 RxRelay lib。当您需要不同的行为但希望在您可以使用的所有模块之间共享单点交互时,还可以获得更全面的解决方案 RxHub
BehaviorSubject
将满足您的需求。
https://github.com/Netflix/RxJava/wiki/Subject#behaviorsubject
如果您需要更复杂的行为,您可以随时编写自己的行为 Subject
实现。这样做似乎非常简单。
一个稍晚的答案,但对于你的情节来说,一个比BehaviorSubject更好的选择可能是来自的行为 RxRelay lib。当您需要不同的行为但希望在您可以使用的所有模块之间共享单点交互时,还可以获得更全面的解决方案 RxHub
BehaviorSubject
将满足您的需求。
https://github.com/Netflix/RxJava/wiki/Subject#behaviorsubject
如果您需要更复杂的行为,您可以随时编写自己的行为 Subject
实现。这样做似乎非常简单。
我认为如果将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上的简单回调?