我尝试使用以下代码
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();
}
}