RxJava - 将冷可观察对象转换为热可观察对象
RxJava - Transform a cold observable to hot observable
我要解决的问题
我正在构建一种 MVP(或随便你怎么称呼它),其中视图可以订阅和取消订阅同一模型。
开始时,视图订阅模型。模型为空,视图不显示任何内容。
调用方法时(例如,当用户单击时),会通过网络发出请求。结果将填充模型,模型将通知视图更改。
如果另一个视图订阅,它应该收到模型当前值的通知,而无需通过网络进行任何调用。
如果在请求进行时所有视图取消订阅,模型仍将被填充,以便另一个视图可以
我的尝试
我正在使用 Retrofit
和 RxJava2
通过网络发出请求,这提供了冷 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);
现在更容易,也更干净。非常感谢!
我要解决的问题
我正在构建一种 MVP(或随便你怎么称呼它),其中视图可以订阅和取消订阅同一模型。
开始时,视图订阅模型。模型为空,视图不显示任何内容。 调用方法时(例如,当用户单击时),会通过网络发出请求。结果将填充模型,模型将通知视图更改。
如果另一个视图订阅,它应该收到模型当前值的通知,而无需通过网络进行任何调用。 如果在请求进行时所有视图取消订阅,模型仍将被填充,以便另一个视图可以
我的尝试
我正在使用 Retrofit
和 RxJava2
通过网络发出请求,这提供了冷 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);
现在更容易,也更干净。非常感谢!