用RxJava取代EventBus - N订阅者总是在监听



我在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 ?

相关内容

  • 没有找到相关文章

最新更新