我正在Android应用中用EventBus
替换RxJava
模式。我有事件提醒任何感兴趣的各方我的缓存单例中的数据更新。每次调用Web服务时,都会更新数据,并通过发布的事件提醒订阅者。
我在RxJava中使用AsyncSubject
接近此设置。观察者从主题中获得单个事件,但随后他们获得onComplete
事件并取消订阅。这首先加载UI,但是当需要刷新数据时,不会通知订阅者。如何告诉那些Subscribers
继续倾听来自onNext
的更多Subject
个事件?
我需要Subject
来报告最近的项目。 PublishSubject
仅在订阅后发出项目,因此不能满足我的需求。我的订阅者在不同的时间(可能在第一个数据事件之后)开始观察,因此我需要主题发出最后观察的项目,然后保持流为后续项目打开。似乎AsyncSubject和PublishSubject的组合就是我所需要的。有没有办法用内置类来完成这个,或者我是否需要创建自己的主题?
WebServiceObservable OR CacheObservable
^
|
AsyncSubject
^
|
/ \
/ \
/ \
UiObserver1 UiObserver2
答案 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?