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()
が呼び出された場合、非同期になり、明らかにここでの例外処理は機能しません。
これを達成する方法はありますか? OnErrorNotImplementedException
にonError
をスローしないsubscribe()
メソッドがあればいいのにと思います。
これが私たちが仕事でそれを行う方法です。アクションを作成する代わりに、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) {
}
}
別の可能な解決策は次のとおりです。onNextとThrowableを定義できます(ラムダ構文を失うこともできません)。
.subscribe(t -> doSomething(t), e -> showError(e));
この「.onErrorResumeNext(Observable.empty())」が好きな場合、エラーが発生するとストリームが完了します。そのため、アクションは呼び出されません。 '.retry()'を使用すると、エラーが発生したときにストリームが自動的に再起動されます。
このエラーは、Subscribeメソッドを呼び出すときに発生しますが、onError()コールバックを提供しません。 Kotlin
subscribe(object : DisposableCompletableObserver() {
override fun onComplete() {
// on successful completion }
override fun onError(e: Throwable) {
//error message
}
}
)