PublishSubject 在 `onError()` 后停止发射

PublishSubject stops emitting after `onError()`

RxJava 查询

嗨,

我有一个PublishSubject<Boolean> subject = PublishSubject.create();

我正在订阅上述主题并在此之后进行 API 调用:

subject.observeOn(IOThread)
    .flatMap(boolean -> getSomethingFromServer())
    .observeOn(MainThread)
    .subscribe(something ->
        showSomethingOnView(),
        error -> showRetryView();
    )

当出现 UnknownHostExceptionSocketTimeoutException 等错误时,我会显示重试按钮。单击重试按钮后,我将向 PublishSubject() 发送一个事件。

subject.onNext(boolean Value);

但是在错误出现后,主题正在终止并且没有其他事件被转发。

通过快速搜索,我可以使用 Notification<> 包装器实现此目的,但还没有找到应用它的好方法。

这是我找到的两个链接:

This link提到使用Notification.

使用 Notification 但包装了 Subject 的初始类型,即 Boolean 在 Notification 中。如何将从 getSomethingFromServer() 获得的错误和响应包装到通知中。

我是不是做错了什么?

谢谢

Jake Wharton 那里得到了答案:

"在 flatMap 中映射 getSomethingFromServer() 并添加一个 onErrorResume* 运算符

然后封闭流将永远不会终止

.flatMap(b -> getSomethingFromServer() .map(response -> WrapperType.success(response)) .onErrorReturn(e -> WrapperType.error(e)) )

随心所欲 WrapperTypeNotification 或你自己的

也来自侯赛因·阿拉丁https://twitter.com/Hussein_Ala

" 我以前没有使用过 Notification,但我要做的是用事件 class 包装从 getSomethingFromServer() 发出的所有内容。事件可以有不同的状态 "Success"、"Error" 等等,然后将 onErrorgetSomethingFromServer() 覆盖为 return 一个事件。 最后你可以处理 onNext

中的不同情况

事件是您要创建的自定义 class,您可以通过执行类似这样的操作来覆盖 onError getSomethingFromServer().onErrorReturn((Function<Throwable, Event>) throwable -> new Event(Event.ERROR, throwable))

所以这里的技巧是 onErrorReturn()