我正在构建一种MVP(或任何你称之为的),其中视图可以订阅和取消订阅相同的模型。
开始时,视图会订阅该模型。模型为空,视图不显示任何内容。 在调用方法时(例如,当用户单击时),通过网络发出请求。结果将填充模型,该模型将通知视图更改。
如果另一个视图订阅,则应通过模型当前值通知它,而不通过网络进行任何调用。 如果在请求正在进行时所有视图都取消订阅,那么该模型仍然会被普及,以便另一个视图可以
我正在使用Retrofit
与RxJava2
通过网络发出请求,这会提供冷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
。
答案 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);
现在更容易,更清洁。非常感谢!