RxJava - 将冷可观察变换为热可观察

时间:2017-06-16 09:19:45

标签: rx-java rx-java2

我想解决的问题

我正在构建一种MVP(或任何你称之为的),其中视图可以订阅和取消订阅相同的模型。

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

如果另一个视图订阅,则应通过模型当前值通知它,而不通过网络进行任何调用。 如果在请求正在进行时所有视图都取消订阅,那么该模型仍然会被普及,以便另一个视图可以

我的尝试

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

对于模型,我想构建一个热的Observable,它将最后一个发射的项目返回给任何新订阅者。如何让hot 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

1 个答案:

答案 0 :(得分:0)

感谢您的评论,我可以使用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);

现在更容易,更清洁。非常感谢!