Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.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
Rx Java mergeDelayError未按预期工作_Java_Android_Rx Java_Rx Android - Fatal编程技术网

Rx Java mergeDelayError未按预期工作

Rx Java mergeDelayError未按预期工作,java,android,rx-java,rx-android,Java,Android,Rx Java,Rx Android,我在和Android应用程序中使用RxJava和RxAndroid。我正在使用将两个retro fit网络调用合并到一个可观察对象中,如果其中一个发出一个,它将处理发出的项,如果其中一个发出一个,则处理错误。这是不起作用的,它只是在其中一个遇到错误时触发onError操作。现在为了测试这一点,我转向了一个非常简单的示例,但当我有一个onError调用时,仍然不会调用successAction。见下面的例子 Observable.mergeDelayError( O

我在和Android应用程序中使用RxJava和RxAndroid。我正在使用将两个retro fit网络调用合并到一个可观察对象中,如果其中一个发出一个,它将处理发出的项,如果其中一个发出一个,则处理错误。这是不起作用的,它只是在其中一个遇到错误时触发onError操作。现在为了测试这一点,我转向了一个非常简单的示例,但当我有一个onError调用时,仍然不会调用successAction。见下面的例子

Observable.mergeDelayError(
                Observable.error(new RuntimeException()),
                Observable.just("Hello")
            )
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .finallyDo(completeAction)
            .subscribe(successAction, errorAction);
只有当我使用两个成功观察值时,才会调用成功操作。我是否遗漏了错误应该如何工作

编辑:


我发现,如果我删除
observeOn
subscribeOn
的话,一切都会正常工作。我需要指定线程,并认为这是使用Rx的全部要点。你知道为什么指定那些
调度程序会破坏这种行为吗?

这看起来仍然像mergeDelayError操作符中的一个bug,但我能够通过复制observer和订阅每个可观察对象来让它工作

Observable.mergeDelayError(
            Observable.error(new RuntimeException())
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribeOn(Schedulers.io()),
            Observable.just("Hello")
                 .observeOn(AndroidSchedulers.mainThread())
                 .subscribeOn(Schedulers.io())
        )
        .finallyDo(completeAction)
        .subscribe(successAction, errorAction);

我认为您不必等到终端事件和主线程退出后再将事件交付给您的观察者。我使用RxJava 1.0.14通过了以下测试:

@Test
public void errorDelayed() {
    TestSubscriber<Object> ts = TestSubscriber.create();
    Observable.mergeDelayError(
            Observable.error(new RuntimeException()),
            Observable.just("Hello")
        )
        .subscribeOn(Schedulers.io()).subscribe(ts);

    ts.awaitTerminalEvent();

    ts.assertError(RuntimeException.class);
    ts.assertValue("Hello");
}
@测试
公共无效错误延迟(){
TestSubscriber ts=TestSubscriber.create();
可观测误差(
Observable.error(新的RuntimeException()),
可观察。只是(“你好”)
)
.subscribeOn(Schedulers.io()).subscribe(ts);
t.等待终端事件();
ts.assertError(RuntimeException.class);
ts.assertValue(“你好”);
}
使用.observeOn(AndroidSchedulers.mainThread(),true)而不是.observeOn(AndroidSchedulers.mainThread()

public final observeOn(调度程序,布尔延迟错误){
返回observeOn(调度程序、延迟错误、RxRingBuffer.SIZE);
}
上面是observeOn函数的签名。下面的代码有效

  Observable.mergeDelayError(
                Observable.error(new RuntimeException()),
                Observable.just("Hello")
        )
                .observeOn(AndroidSchedulers.mainThread(), true)
                .subscribeOn(Schedulers.io())
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(String s) {

                    }
                });
Observable.mergeDelayError(
Observable.error(新的RuntimeException()),
可观察。只是(“你好”)
)
.observeOn(AndroidSchedulers.mainThread(),true)
.subscribeOn(Schedulers.io())
.subscribe(新订户(){
@凌驾
未完成的公共无效(){
}
@凌驾
公共无效申报人(可丢弃的e){
}
@凌驾
public void onNext(字符串s){
}
});

从ConcatDelayError线程获得了这个技巧:

文档说,
来自任何源观测值的onError通知将(…)终止合并的可观察对象。
从图表中可以清楚地看出,任何错误都会被延迟到所有其他错误完成之后,然后被触发,在未完成的情况下终止可观察对象。因此,您确实应该收到
成功操作
一次,然后是错误操作。(但不是完整操作)你如何断言不调用success?我只是在每个操作中都有log语句,没有其他内容。这似乎不像文档描述的那样,但我不确定为什么会这样。我尝试过,我观察到与你相同的行为。根据来源,似乎merge操作符收到的任何
onError
都会将其标记为c已完成,这可能会阻止它在下一个版本中进一步传输。我不认为它应该是这样的行为。我认为如果您更新到1.0.14,原始版本中的代码片段将正常工作。我认为这应该是可接受的答案!我花了一天的时间调试此问题。无论如何,您必须指定2次您想要的代码,这非常令人困惑h延迟错误!最好的答案!!!拯救我的一天。谢谢!
  Observable.mergeDelayError(
                Observable.error(new RuntimeException()),
                Observable.just("Hello")
        )
                .observeOn(AndroidSchedulers.mainThread(), true)
                .subscribeOn(Schedulers.io())
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(String s) {

                    }
                });