2

目前我正在调查向 RxJava 的迁移,并决定我的经理(accountManager)将是一个有趣的起点。目前,Manager 有一个侦听器列表,并在帐户更新和出现问题时相应地发送更新。

private List<WeakReference<ProfileChangeListener>> mListeners = new ArrayList<>();

public interface ProfileChangeListener {
    void onProfileUpdated(Account account);
    void onProfileFailed(Exception e);
}

我的 Rx 解决方案涉及Subject

private SerializedSubject<Account, Account> mManagerSubject = new SerializedSubject<>(BehaviorSubject.<Account>create());

public Observable<Account> observe() {
    return mManagerSubject;
}

然后当更新发生时,我调用以下方法之一:

private void onProfileUpdated(Account account) {
    mManagerSubject.onNext(account);
}

private void onProfileFailed(final Exception e) {
    mManagerSubject.onError(e);
}

问题

问题是一旦onError被调用,任何通过监听的人observe将永远不会从onNext.

我仍然希望订阅者收到 onError 以便他们可以处理错误状态,但稍后onNext仍然可以使用更新的帐户调用,我仍然希望订阅者处理更新的帐户。

我已经尝试过使用 的解决方案onErrorResumeNextonErrorReturn onExceptionResumeNext但它们都没有传播onError.

TLDR:如何在调用 onError 后保持订阅者的状态,同时仍在传播 onError?

4

1 回答 1

4

Rx 中的“错误”一开始可能有点难以理解,因为它们的含义与大多数人的预期略有不同。

错误处理文档(强调我的):

Observable 通常不会抛出异常。相反,它通过使用 onError 通知终止 Observable 序列来通知任何观察者发生了不可恢复的错误。

onError()应该在Observable遇到不可恢复的错误时使用 - 即当您Observable无法继续发射项目时。当您订阅时,您可能会使用类似onErrorResumeNext尝试一些恢复操作的方法,但这应该是源的结尾Observable

相反,您可能想要调整您Observable发出的内容以支持发出错误项,或者包含一个指示遇到错误的标志。

如果您的错误确实无法恢复,那么您可能需要重新审视您的恢复策略并尝试稍微不同的方法。

于 2015-08-07T15:46:20.540 回答