RxJava - 将冷可观察对象转换为热可观察对象

RxJava - Transform a cold observable to hot observable

我要解决的问题

我正在构建一种 MVP(或随便你怎么称呼它),其中视图可以订阅和取消订阅同一模型。

开始时,视图订阅模型。模型为空,视图不显示任何内容。 调用方法时(例如,当用户单击时),会通过网络发出请求。结果将填充模型,模型将通知视图更改。

如果另一个视图订阅,它应该收到模型当前值的通知,而无需通过网络进行任何调用。 如果在请求进行时所有视图取消订阅,模型仍将被填充,以便另一个视图可以

我的尝试

我正在使用 RetrofitRxJava2 通过网络发出请求,这提供了冷 Observable

对于该模型,我想构建一个热门 Observable,returns 最后发送给任何新订阅者的项目。我怎样才能让热的 Observable 从冷的 Observable 中获取它发出的项目 Observable?

到目前为止,我可以通过 BehaviourSubject:

// The same model is provided to all views through a getter
BehaviorSubject<User> model = BehaviorSubject.create();

// Make request
Observable<User> resource = getResourceOverNetwork(3);
resource.subscribe(new Consumer<User>() {
    @Override
    public void accept(@NonNull User user) throws Exception {
        model.onNext(user);
    }
});

这个解决方案感觉不对,因为我必须手动将事件从冷 Observable 转发到 BehaviourSubject

感谢您的评论,我可以通过 RxRelay 成功实现我需要的功能。

创建模型:

// The same model is provided to all views through a getter
BehaviorRelay<User> model = BehaviorRelay.create();
    
model.subscribe(view);

随时提出要求:

// Make request
Observable<User> resource = getResourceOverNetwork(3);
resource.subscribe(model);
    
// Make a new request
getResourceOverNetwork(4).subscribe(model);

现在更容易,也更干净。非常感谢!