首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >RxJava doOnError vs onError

RxJava doOnError vs onError
EN

Stack Overflow用户
提问于 2019-04-16 20:34:37
回答 2查看 7.3K关注 0票数 7

我正在尝试使用以下代码

代码语言:javascript
复制
initLocalSettingsIfNeed()
                            .andThen(initGlobalSettingsIfNeed(configuration))
                            .doOnComplete(callback::onSuccess)
                            .doOnError(throwable -> callback.onError(throwable.getLocalizedMessage()))
                            .subscribe();

但我有个例外

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-16 21:22:54

关于你最初的问题,你必须知道doOnError不是onError的替代品。你在this blog中有一个很好的简短的解释

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

另一方面,subscribe()中的onError回调确实使用了错误。意味着,它将捕获错误,并允许您处理这些错误,而无需重新抛出错误本身。

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

这种方法是有效的,但我有警告‘订阅未使用的结果’,因为我知道这需要在调用onError或onComplete时自动处理,有没有办法避免这个警告?- Pavel Poley

一个不错的方法是让Repository中的方法返回一个Observable,然后您可以在ViewModel中订阅它们。然后,在每个ViewModel类中,您可以拥有一个带有CompositeDisposable的成员变量,您可以在其中将每个订阅的disposable添加到存储库返回的可观察对象中。最后,您应该重写onCleared方法来处理存储在CompositeDisposable中的所有可处置物品。

代码语言:javascript
复制
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();
    }

}
票数 7
EN

Stack Overflow用户

发布于 2019-04-16 20:44:58

尝尝这个

代码语言:javascript
复制
initLocalSettingsIfNeed()
    .andThen(initGlobalSettingsIfNeed(configuration))
    .subscribe({completed->
        callback.onSuccess()
    },{throwable->
        callback.onError(throwable.getLocalizedMessage())
    })
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55708278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档