我尝试使用以下代码

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


但是我有能力


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


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

最佳答案

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


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

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


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


这种方法有效,但我警告“订阅的结果
不使用”,因为我知道这需要在
调用onError或onComplete,是否有办法避免此警告? – Pavel Poley


一个好的方法是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();
    }

}

07-26 02:26