用RxJava替换侦听器

时间:2015-08-07 15:11:41

标签: android reactive-programming rx-java observable rx-android

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

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之后保留订阅者订阅?

1 个答案:

答案 0 :(得分:4)

Rx中的“错误”起初可能有点难以掌握,因为它们与大多数人的期望略有不同。

来自Error Handling documentation(强调我的):

  

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

onError()遇到无法恢复的错误时,应该使用

Observable,即Observable无法继续发出项目时。在您订阅时,您可以使用类似onErrorResumeNext的内容来尝试某些恢复操作,但这应该是源Observable的结尾。

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

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