我在Android应用程序中用RxJava
替换EventBus
模式。我有事件提醒任何感兴趣的各方更新我的缓存单例中的数据。每当web服务被调用时,数据将被更新,并且订阅者将通过发布的事件得到警报。
我有一些接近这个设置在RxJava与AsyncSubject
。观察者从主题获得单个事件,但随后它们获得onComplete
事件并退订。这在UI首次加载时工作,但是当需要刷新数据时,不需要通知订阅者。我如何告诉那些Subscribers
继续监听来自Subject
的更多onNext
事件?
我需要一个Subject
来报告最近的项目。PublishSubject
只在订阅后才会发出项目,所以不太符合我的需求。我的订阅者在不同的时间开始观察(可能在第一个数据事件之后),所以我需要Subject发出观察到的最后一个项目,然后保持流为后续项目打开。似乎AsyncSubject和PublishSubject的组合是我所需要的。有没有办法用内置的类来完成这个任务,或者我需要创建自己的主题?
WebServiceObservable OR CacheObservable
^
|
AsyncSubject
^
|
/
/
/
UiObserver1 UiObserver2
BehaviorSubject
将满足您的需求。https://github.com/Netflix/RxJava/wiki/Subject behaviorsubject
如果你需要更复杂的行为,你可以编写自己的Subject
实现。这看起来很简单。
一个有点晚的答案,但一个稍微更好的选择,为您的场景比行为主题可以从RxRelay库的行为中继。当你需要不同的行为,但又想在所有模块之间共享单点交互时,你可以使用RxHub
我认为如果您使用switchOnNext操作符的BehaviorSubject更简单。
switchOnNext ()将一个发出Observable的Observable(在本例中是BehaviorSubject)转换成一个单独的Observable,该Observable发出最近发出的Observable发出的项
switchOnNext()返回的可观察对象从先前发出的可观察对象中取消订阅,开始从最新的可观察对象中发出项
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 ?