我尝试使用以下代码
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(使用前将#替换为@)