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

rag*_*oid 2 java android rx-java rx-java2

RxJava 查询

你好,

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

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

subject.observeOn(IOThread)
    .flatMap(boolean -> getSomethingFromServer())
    .observeOn(MainThread)
    .subscribe(something ->
        showSomethingOnView(),
        error -> showRetryView();
    )
Run Code Online (Sandbox Code Playgroud)

当出现类似UnknownHostException,的错误时SocketTimeoutException,我会显示一个重试按钮。单击重试按钮后,我将向PublishSubject().

subject.onNext(boolean Value);

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

在快速搜索中,我可以使用Notification<>包装器实现这一点,但还没有找到应用它的好方法。

这是我找到的两个链接:

此链接提到使用Notification.

此链接使用通知,但包装主题的初始类型,即Boolean在通知中。如何将收到的错误和响应包装getSomethingFromServer()到通知中。

我在这里做错了吗?

谢谢

rag*_*oid 5

杰克沃顿那里得到答案:

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

封闭的流永远不会终止

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

无论WrapperType你想要什么,Notification或者你自己的”

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

" 我以前没有使用Notification过,但我要做的是getSomethingFromServer()用一个事件类包装从它发出的所有东西。事件可以有不同的状态“成功”、“错误”等,然后覆盖onErrorfromgetSomethingFromServer()以返回一个事件。最后你可以处理不同的情况onNext

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

所以这里的诀窍是onErrorReturn()