RxJava doOnError与onError

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (757)

我尝试使用以下代码

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

但我有一个例外

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

我想我没有正确使用这种方法,我认为可以用doOnComplete doOnErrorsubscribe中的观察者替换,我错了?

提问于
用户回答回答于

关于你原来的问题,你必须知道doOnError不是一个替代品onError。您在此博客中有一个简短的解释:

实际上他们之间有一个关键的区别。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();
    }

}
用户回答回答于

试试这个

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

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励