防止OnErrorNotImplementedException

时间:2015-11-05 15:30:44

标签: rx-java

我希望实现这一点,如果我调用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

5 个答案:

答案 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
    }
    }
  )