Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 等待已订阅的可观察项_Android_Rx Java - Fatal编程技术网

Android 等待已订阅的可观察项

Android 等待已订阅的可观察项,android,rx-java,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) {

我通过订阅呼叫服务器,并使用结果更新
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=fetch.byId(id)
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
}
@凌驾
公共无效申报人(可丢弃的e){
}
@凌驾
public void onNext(模型){
//使用模型更新视图
}
});
所有这些都应该在用户不可见的情况下发生(没有进度对话框等)

我更想要的是处理点击
活动1
:点击时,我必须等待
xxx
接收
模型
,然后启动
活动2
(需要显示
模型
值)。如果单击发生在
xxx
完成之后,那么我不必等待(因为它已经完成)并立即启动
活动2


我怎样才能优雅地等待已经订阅的可观察对象呢?

您可以通过使用操作符来实现这一点。只有当所有压缩的可观察物发出时,它才会发出一个项目,即加载数据并单击按钮

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()
            }
        });
fetch.byId(id)
.zipWith(RxView.clicks)(按钮)
.doOnNext(单击->showLoading()),//当用户单击按钮时,显示进度对话框
(模型,单击)->model//加载两个模型并单击按钮时,仅向前传递模型
)
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
}
@凌驾
公共无效申报人(可丢弃的e){
}
@凌驾
public void onNext(模型){
//使用模型更新视图
startActivity2()
}
});

您可以通过使用操作员来执行此操作。只有当所有压缩的可观察物发出时,它才会发出一个项目,即加载数据并单击按钮

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()
            }
        });
fetch.byId(id)
.zipWith(RxView.clicks)(按钮)
.doOnNext(单击->showLoading()),//当用户单击按钮时,显示进度对话框
(模型,单击)->model//加载两个模型并单击按钮时,仅向前传递模型
)
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
}
@凌驾
公共无效申报人(可丢弃的e){
}
@凌驾
public void onNext(模型){
//使用模型更新视图
startActivity2()
}
});

不是最好的解决方案,而是最简单的解决方案


不是最好的解决方案,但最简单的方法是使用


如果单击发生在xxx完成之后,那么我不必等待(因为它已经完成)并立即启动活动2
。在这一部分我仍然不知道:如果
xxx
完成,你已经进入
Activity2
=>没有办法点击
Activity1
?一切都发生在Activity1中,Activity2对这个问题没有意义,只是一个行动的例子。
如果点击发生在xxx完成之后,那么我不必等待(因为已经完成了)现在就开始活动2。这一部分我还不知道:如果
xxx
完成,你已经去了
Activity2
=>没有办法点击
Activity1
?Activity1中发生的一切,Activity2对这个问题没有意义,只是一个行动的例子。实际上,这应该是可行的,但这是c即使没有主题也可以实现。实际上,这应该可以实现,但即使没有主题也可以实现。我更喜欢
combinelatetest
,而不是
zip
,因为它可以多次单击。如果您需要它只工作一次,则执行
获取.byId(id).combinelatetest(RxView.clicks(button)…更有效。点击(1) .subscribe(…)
,因为zip会在抓取过程中缓冲所有的点击。我更喜欢
CombineTest
,而不是
zip
,因为它可以进行多次点击。如果您需要它只工作一次,那么执行
fetch.byId(id)。CombineTest(RxView.clicks(button)…)。获取(1)。订阅(…)
as zip将在抓取期间缓冲所有点击。
xxx.toCompletable()
   .doOnSubscribe(this::showProgress)
   .subscribe(this::goToActivity2, this::displayError);