等待已订阅的Observable

时间:2017-05-11 09:13:13

标签: android rx-java

我打电话给订阅的服务器,并用结果更新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?

2 个答案:

答案 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);