web-dev-qa-db-ja.com

OnErrorNotImplementedExceptionを防止します

Obervable.subscribe(Action1)メソッドを呼び出すと、どこにもOnErrorNotImplementedExceptionがスローされないことを実現したいのですが、Obervable.subscribe(Action1, Action1)を呼び出すと、エラー時に2番目のアクションが呼び出されます。通常どおりに発生します。私は2つの方法を試しました:

_.onErrorResumeNext(Observable.empty())
_

このようにOnErrorNotImplementedExceptionはスローされませんが、2番目のアクションも渡した場合、アクションも呼び出されません。

2番目:

_.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()が呼び出された場合、非同期になり、明らかにここでの例外処理は機能しません。

これを達成する方法はありますか? OnErrorNotImplementedExceptiononErrorをスローしないsubscribe()メソッドがあればいいのにと思います。

9
WonderCsabo

これが私たちが仕事でそれを行う方法です。アクションを作成する代わりに、onErrorとonCompletedが実装された抽象NYTSubscriberを作成しました。このようにして、このサブスクライバーを使用し、onNextコールバックのみを実装できますOR必要に応じて、onErrorとonCompletedをオーバーライドできます

public abstract class NYTSubscriber<T> extends Subscriber<T> {

@Override
public void onCompleted() {
}

@Override
public void onError(Throwable e) {
}
}
10
FriendlyMikhail

別の可能な解決策は次のとおりです。onNextとThrowableを定義できます(ラムダ構文を失うこともできません)。

.subscribe(t -> doSomething(t), e -> showError(e));
10
FireZenk

この「.onErrorResumeNext(Observable.empty())」が好きな場合、エラーが発生するとストリームが完了します。そのため、アクションは呼び出されません。 '.retry()'を使用すると、エラーが発生したときにストリームが自動的に再起動されます。

このエラーは、Subscribeメソッドを呼び出すときに発生しますが、onError()コールバックを提供しません。 Kotlin

subscribe(object : DisposableCompletableObserver() {
    override fun onComplete() {
        // on successful completion   }
    override fun onError(e: Throwable) {
        //error message
    }
    }
  )
0
arihant singhi