我正在尝试使用以下代码
initLocalSettingsIfNeed()
.andThen(initGlobalSettingsIfNeed(configuration))
.doOnComplete(callback::onSuccess)
.doOnError(throwable -> callback.onError(throwable.getLocalizedMessage()))
.subscribe();
但我有个例外
由于subscribe()方法调用中缺少onError处理程序,因此未处理异常。
我想我没有正确使用这个方法,我以为可以在subscribe()
方法中用观察者替换doOnComplete
doOnError
,我错了吗?
发布于 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
中的所有可处置物品。
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();
}
}
发布于 2019-04-16 20:44:58
尝尝这个
initLocalSettingsIfNeed()
.andThen(initGlobalSettingsIfNeed(configuration))
.subscribe({completed->
callback.onSuccess()
},{throwable->
callback.onError(throwable.getLocalizedMessage())
})
https://stackoverflow.com/questions/55708278
复制相似问题