防止OnErrorNotImplementedException

Won*_*abo 9 android subscribe rx-java rx-java2

我希望实现这一点,如果我调用该Obervable.subscribe(Action1)方法,它不会抛出OnErrorNotImplementedException任何地方,但如果我调用Obervable.subscribe(Action1, Action1),则在正常引发错误时调用第二个操作.我试过两种方法:

.onErrorResumeNext(Observable.empty())
Run Code Online (Sandbox Code Playgroud)

这种方式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);
                }
            }
        };
    }
});
Run Code Online (Sandbox Code Playgroud)

这个if的问题observeOn()稍后会被调用,然后这将是异步的,显然我的异常处理在这里是行不通的.

有没有办法实现这一目标.我希望会有一个subscribe()不抛的方法OnErrorNotImplementedExceptiononError.

Fir*_*enk 11

这是另一种可能的解决方案,你可以定义onNext和Throwable(也就是你不能松散lambda语法):

.subscribe(t -> doSomething(t), e -> showError(e));
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!好吧,我的意图是没有在任何地方添加虚拟onError.但由于没有其他解决方案,我现在就做. (2认同)

Fri*_*ail 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) {
}
}
Run Code Online (Sandbox Code Playgroud)


Man*_*ath 5

如果您使用的是Kotlin,那么语法就像

 .subscribe({success -> doOnSuccess(success)},{error -> doOnError(error)})
Run Code Online (Sandbox Code Playgroud)