RxJava doOnError与onError

时间:2019-04-16 12:34:37

标签: android rx-java rx-java2

我正在尝试使用以下代码

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

但是我有能力

  

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

我想我没有正确使用此方法,我想可以用内部订阅者替换doOnComplete doOnError,我错了吗?

2 个答案:

答案 0 :(得分:2)

尝试

initLocalSettingsIfNeed()
    .andThen(initGlobalSettingsIfNeed(configuration))
    .subscribe({completed->
        callback.onSuccess()
    },{throwable->
        callback.onError(throwable.getLocalizedMessage())
    })

答案 1 :(得分:2)

关于最初的问题,您必须知道doOnError不能代替onError。您在this blog中对此有一个简短的解释:

  

实际上,它们之间只有一个主要区别。 doOnError()基本上仅触发其回调,然后将遇到的错误传递到下游。因此,如果整个流都被订阅,而没有Subscribe()中的onError回调,则您的应用将因OnErrorNotImplementedException而崩溃。

     

相反,subscribe()中的onError回调确实消耗了   错误。这意味着,它将捕获错误,并让您处理它们   而不会自行抛出错误。让我们写另一个单元   测试以确认:

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

  

此方法有效,但我警告“订阅结果   不使用”,因为我知道当需要   调用onError或onComplete,是否有办法避免此警告? –帕维尔·波利

一种好的方法是,Repository中的方法返回一个Observable,然后您可以在ViewModel中对其进行订阅。然后,在每个ViewModel类中,您都可以使用一个带有CompositeDisposable的成员变量,您可以在其中将每个预订的一次性对象添加到存储库返回的Observable中。最后,您应该重写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();
    }

}
相关问题