【问题标题】:Restart BehaviorSubject after an error出错后重启 BehaviorSubject
【发布时间】:2016-10-04 10:10:10
【问题描述】:

想要的行为:

subject = BehaviorSubject.create(1);
subject.subscribe(number -> print(number), error -> print(error));

subject.onNext(2);
subject.onNext(3);
subject.onError(new RuntimeException("I'm an error"));
subject.onNext(4);
subject.onNext(5);

有了这个输出:

1
2
3
I'm an error
4
5

我的问题是 onError 之后的 onNext 不起作用(这是有意的,遵循 RxJava 规则),但我需要能够适应错误,同时还要将它们传递到流中(向用户展示一些反馈)。

有没有办法做到这一点?

【问题讨论】:

    标签: java android rx-java behaviorsubject


    【解决方案1】:

    如果您希望忽略 onErroronComplete,可以使用 RxRelay 库。

    说明:

    主题有助于弥合非 Rx API 之间的差距。然而,它们以一种破坏性的方式是有状态的:当它们收到 onComplete 或 onError 时,它们不再可用于移动数据。这是可观察的契约,有时它是期望的行为。大多数时候不是。

    中继只是没有上述属性的主题。它们允许您轻松地将非 Rx API 桥接到 Rx,而不必担心意外触发终端状态。

    【讨论】:

    • 好的,它解决了一个问题:弹性。我仍然需要一种将错误传递给 ui 的方法。使用 BehaviorSubject 我只需调用 .onError(error) 并且 ui 会收到错误。使用 BehaviorRelay 我找不到方法。
    • @DavidCorsalini 我认为您不会找到任何只通过 onError() 的实现,主要是因为规范说它是下游任何事物的终端事件。也许创建一个包装类来将消息和错误表示为单个对象,并且只使用 onNext
    【解决方案2】:

    尝试在订阅前使用 .onErrorReturn()

    【讨论】:

    • 使用 .onErrorReturn() 我可以返回一个值。如果错误后值发生变化(这是我的情况),我将看不到这些变化。此外,我不会收到错误,因为它们已被此方法覆盖。 .onErrorReturnNext() 返回另一个我没有订阅的 Observable,所以我不会收到他的下一个。
    猜你喜欢
    • 1970-01-01
    • 2011-05-08
    • 2019-07-25
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 2018-04-26
    • 1970-01-01
    相关资源
    最近更新 更多