Rx java RxJava-将冷可观测转换为热可观测 我想解决的问题
我正在构建一种MVP(或者你管它叫什么),视图可以订阅和取消订阅同一个模型 开始时,视图订阅模型。模型为空,视图不显示任何内容。 调用方法时(例如,当用户单击时),会通过网络发出请求。结果将填充模型,模型将通知视图更改 如果另一个视图订阅,则应使用模型当前值通知它,而无需通过网络进行任何调用。 如果在请求进行期间所有视图都取消订阅,则模型仍应被populplate,以便可以使用另一个视图 我的尝试 我正在使用Rx java RxJava-将冷可观测转换为热可观测 我想解决的问题,rx-java,rx-java2,Rx Java,Rx Java2,我正在构建一种MVP(或者你管它叫什么),视图可以订阅和取消订阅同一个模型 开始时,视图订阅模型。模型为空,视图不显示任何内容。 调用方法时(例如,当用户单击时),会通过网络发出请求。结果将填充模型,模型将通知视图更改 如果另一个视图订阅,则应使用模型当前值通知它,而无需通过网络进行任何调用。 如果在请求进行期间所有视图都取消订阅,则模型仍应被populplate,以便可以使用另一个视图 我的尝试 我正在使用改装和RxJava2通过网络发出请求,这提供了一个冷可观察的 对于该模型,我想构建一个h
改装和RxJava2
通过网络发出请求,这提供了一个冷可观察的
对于该模型,我想构建一个hotObservable
,将最后发出的项目返回给任何新订户。我怎样才能使热的可观测对象从冷的可观测对象中获取其发射的项目
到目前为止,我可以通过行为主题
实现这一点:
// 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(用户);
}
});
此解决方案感觉不正确,因为我必须手动将事件从coldObservable
转发到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
也是观察者,谢谢。但是,在我的例子中,它不起作用,因为资源
在发出第一个值后完成,使得模型
也完成了。第二次发出请求不会使模型
在项目完成时发出项目。