Rx java RxJava-将冷可观测转换为热可观测 我想解决的问题

Rx java RxJava-将冷可观测转换为热可观测 我想解决的问题,rx-java,rx-java2,Rx Java,Rx Java2,我正在构建一种MVP(或者你管它叫什么),视图可以订阅和取消订阅同一个模型 开始时,视图订阅模型。模型为空,视图不显示任何内容。 调用方法时(例如,当用户单击时),会通过网络发出请求。结果将填充模型,模型将通知视图更改 如果另一个视图订阅,则应使用模型当前值通知它,而无需通过网络进行任何调用。 如果在请求进行期间所有视图都取消订阅,则模型仍应被populplate,以便可以使用另一个视图 我的尝试 我正在使用改装和RxJava2通过网络发出请求,这提供了一个冷可观察的 对于该模型,我想构建一个h

我正在构建一种MVP(或者你管它叫什么),视图可以订阅和取消订阅同一个模型

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

如果另一个视图订阅,则应使用模型当前值通知它,而无需通过网络进行任何调用。 如果在请求进行期间所有视图都取消订阅,则模型仍应被populplate,以便可以使用另一个视图

我的尝试 我正在使用
改装
RxJava2
通过网络发出请求,这提供了一个冷
可观察的

对于该模型,我想构建一个hot
Observable
,将最后发出的项目返回给任何新订户。我怎样才能使热的可观测对象从冷的可观测对象中获取其发射的项目

到目前为止,我可以通过
行为主题
实现这一点:

// 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);
    }
});
//通过getter向所有视图提供相同的模型
BehaviorSubject模型=BehaviorSubject.create();
//请求
可观测资源=getResourceOverNetwork(3);
resource.subscribe(新消费者(){
@凌驾
public void accept(@NonNull User)引发异常{
model.onNext(用户);
}
});

此解决方案感觉不正确,因为我必须手动将事件从cold
Observable
转发到
Behavior Subject
,多亏了您的评论,我可以使用
RxRelay
成功实现我所需的功能

创建模型:

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

model.subscribe(view);
//通过getter向所有视图提供相同的模型
BehaviorRelay模型=BehaviorRelay.create();
model.subscribe(视图);
随时提出请求:

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

// Make a new request
getResourceOverNetwork(4).subscribe(model);
//发出请求
可观测资源=getResourceOverNetwork(3);
资源订阅(模型);
//提出新要求
getResourceOverNetwork(4)、订阅(model);

现在容易多了,干净多了。非常感谢

如果你只想让你的改装结果成为一个热门的观察对象。您可以使用
replay(1).autoConnect
replay(1).autoConnect()
,我应该如何通过网络发出新的请求,使用新的参数,以便更新模型?@LaureC。有两种方法:使用subject中继,这样您就可以将您的操作发布到subject和model,然后订阅此主题并发出请求。或者使用发射器创建可观察的。然而,emitter可能不适合MVP模式,但适用于RxPM。许多解决方案实际上使用subject,您只需执行
资源。订阅(模型)
@Lamorak,我忘记了
subject
也是
观察者,谢谢。但是,在我的例子中,它不起作用,因为
资源
在发出第一个值后完成,使得
模型
也完成了。第二次发出请求不会使
模型
在项目完成时发出项目。