RxJava doOnError 与 onError

2024-01-12

我尝试使用以下代码

initLocalSettingsIfNeed()
                            .andThen(initGlobalSettingsIfNeed(configuration))
                            .doOnComplete(callback::onSuccess)
                            .doOnError(throwable -> callback.onError(throwable.getLocalizedMessage()))
                            .subscribe();

但我有例外

由于缺少 onError 处理程序,该异常未被处理 subscribe() 方法调用。

我想我没有正确使用这个方法,我想可以替换doOnComplete doOnError里面有观察者subscribe()方法,我错了吗?


关于你原来的问题,你必须知道doOnError不是替代品onError:

事实上,它们之间有一个关键的区别。 doOnError() 基本上只触发它的回调,然后将遇到的错误传递给下游。因此,如果在 subscribe() 中没有 onError 回调的情况下订阅整个流,您的应用程序将因 OnErrorNotImplementedException 崩溃。

另一方面, subscribe() 中的 onError 回调确实消耗了 错误。这意味着,它会捕获错误,并让您处理它们 而不自行重新抛出错误。

关于您在一条评论中提到的警告:

这种方法有效,但我警告“订阅的结果” 未使用',因为我知道这需要在以下情况下自动处理: onError 或 onComplete 被调用,有没有办法避免这个警告? ——帕维尔·波利

一个好的方法是你的方法在你的Repository返回一个Observable,然后您可以在您的ViewModel。那么,在每一个ViewModel类你可以有一个成员变量CompositeDisposable您可以在其中将每个订阅的一次性添加到存储库返回的 Observables 中。最后,您应该覆盖onCleared处理储存在仓库中的所有一次性用品的方法CompositeDisposable.

public class MyViewModel extends ViewModel {

    private MyRepository myRepository;
    private final CompositeDisposable disposables;

    @Inject
    public MyViewModel(MyRepository myRepository) {
        ...
        this.myRepository = myRepository;
        disposables = new CompositeDisposable();
        ...
    }

    public void callObservableInRepository() {
         disposables.add(myRepository.myObservable()
                              .subscribe(onSuccess -> {...} , onError -> {...}));
    }

    @Override
    protected void onCleared() {
        disposables.clear();
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RxJava doOnError 与 onError 的相关文章

随机推荐