目前我正在调查向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
,我仍然希望订阅者处理更新的帐户。
我使用onErrorResumeNext
,onErrorReturn
onExceptionResumeNext
尝试了解决方案,但没有一个传播onError
。
TLDR:在onError传播时,如何在调用onError之后保留订阅者订阅?
答案 0 :(得分:4)
来自Error Handling documentation(强调我的):
当Observable通常不会抛出异常。相反,它会通过使用onError通知终止Observable序列来通知任何观察者发生了不可恢复的错误。
onError()
遇到无法恢复的错误时,应该使用 Observable
,即Observable
无法继续发出项目时。在您订阅时,您可以使用类似onErrorResumeNext
的内容来尝试某些恢复操作,但这应该是源Observable
的结尾。
相反,您可能需要调整Observable
发出的支持发出错误项的内容,或者包含一个表示遇到错误的标记。
如果您的错误确实无法恢复,那么您可能需要重新审视恢复策略并尝试稍微不同的方法。