我打电话给订阅的服务器,并用结果更新Activity1
的视图:
//from within Activity1
xxx = fetch.byId(id)
.subscribe(new Subscriber<Model>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Model model) {
//update view with the model
}
});
所有这一切都应该无形地发生在用户身上(没有进度对话框等)。
我想要更多的是处理点击Activity1
:点击后,我必须等待(显示进度对话框)xxx
才能收到model
,然后开始{ {1}}(需要显示Activity2
值)。如果点击发生在model
完成后,我就不必等待(因为它已经完成)并立即启动xxx
。
我如何优雅地等待已订阅的Observable?
答案 0 :(得分:1)
您可以使用zip
运算符执行此操作。只有当所有压缩的observable都被发出时,它才会发出一个项目,即加载数据并用户点击一个按钮。
fetch.byId(id)
.zipWith(RxView.clicks(button)
.doOnNext(click -> showLoading()), // when user clicks the button, show your progress dialog
(model, click) -> model // when both model is loaded and button is clicked, pass only the model forward
)
.subscribe(new Subscriber<Model>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Model model) {
//update view with the model
startActivity2()
}
});
答案 1 :(得分:1)
不是最好的解决方案,但很容易使用AsyncSubject。
AsyncSubject<Model> async = AsyncSubject.create();
fetch.byId(id).subscribe(async);
xxx = async.asObservable();
xxx.subscribe(this.subscriber);
然后,您可以使用doOnSubscribe()
和toCompletable()
链接您想要做的事情。
xxx.toCompletable()
.doOnSubscribe(this::showProgress)
.subscribe(this::goToActivity2, this::displayError);