我希望实现这一点,如果我调用registerUser()#ErrorHandler()
方法,它不会在任何地方抛出Obervable.subscribe(Action1)
,但如果我调用OnErrorNotImplementedException
,则在引发错误时调用第二个操作像平常一样。我试过两种方法:
Obervable.subscribe(Action1, Action1)
这种方式.onErrorResumeNext(Observable.empty())
不会被抛出,但是如果我也传递第二个动作,那么动作也不会被调用。
第二
OnErrorNotImplementedException
如果稍后调用.lift(new Observable.Operator<T, T>() {
@Override
public Subscriber<? super T> call(Subscriber<? super T> subscriber) {
return new Subscriber<T>() {
@Override
public void onCompleted() {
if (!subscriber.isUnsubscribed()) {
subscriber.onCompleted();
}
}
@Override
public void onError(Throwable e) {
if (!subscriber.isUnsubscribed()) {
try {
subscriber.onError(e);
} catch (Throwable t) {
if (!(t instanceof OnErrorNotImplementedException)) {
throw t;
}
}
}
}
@Override
public void onNext(T t) {
if (!isUnsubscribed()) {
subscriber.onNext(t);
}
}
};
}
});
,那么这个问题将是异步的,显然我的异常处理将不起作用。
有没有办法实现这一目标。我希望有一个observeOn()
方法不会在subscribe()
中抛出OnErrorNotImplementedException
。
答案 0 :(得分:10)
这是我们在工作中如何做到这一点。我们没有采取行动,而是制作了一个抽象的NYTSubscriber,它实现了onError和onCompleted。这样您就可以使用此订阅者并仅实现onNext回调,或者您可以在必要时覆盖onError和onCompleted
public abstract class NYTSubscriber<T> extends Subscriber<T> {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
}
答案 1 :(得分:10)
这是另一种可能的解决方案,你可以定义onNext和Throwable(也不能松散lambda语法):
.subscribe(t -> doSomething(t), e -> showError(e));
答案 2 :(得分:1)
如果您使用的是 Kotlin ,则语法类似于
.subscribe({success -> doOnSuccess(success)},{error -> doOnError(error)})
答案 3 :(得分:0)
如果你喜欢这个'.onErrorResumeNext(Observable.empty())'你的流将在发生错误时完成 - 这就是你永远不会调用你的行为的原因。 您可以使用'.retry()',并在出现错误时自动重启您的流。
答案 4 :(得分:0)
调用Subscribe方法时出现此错误,但不提供onError()回调。 科特林
subscribe(object : DisposableCompletableObserver() {
override fun onComplete() {
// on successful completion }
override fun onError(e: Throwable) {
//error message
}
}
)