防止 OnErrorNotImplementedException
Prevent OnErrorNotImplementedException
我想实现的是,如果我调用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()
方法不会在 onError
.
中抛出 OnErrorNotImplementedException
这是我们在工作中的做法。我们没有执行操作,而是创建了一个抽象的 NYTSubscriber,它实现了 onError 和 onCompleted。这样你就可以使用这个订阅者并且只实现 onNext 回调或者你可以在必要时覆盖 onError 和 onCompleted
public abstract class NYTSubscriber<T> extends Subscriber<T> {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
}
这是另一种可能的解决方案,您可以定义 onNext 和 Throwable(同时您不能丢失 lambda 语法):
.subscribe(t -> doSomething(t), e -> showError(e));
如果您这样做 '.onErrorResumeNext(Observable.empty())',您的流将在发生错误时完成 - 这就是您的操作永远不会被调用的原因。
您可以使用“.retry()”,当您遇到错误时,您的流将自动重新启动。
如果你使用的是 Kotlin 那么语法就像
.subscribe({success -> doOnSuccess(success)},{error -> doOnError(error)})
当调用 Subscribe 方法但未提供 onError() 回调时出现此错误。
科特林
subscribe(object : DisposableCompletableObserver() {
override fun onComplete() {
// on successful completion }
override fun onError(e: Throwable) {
//error message
}
}
)
我想实现的是,如果我调用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()
方法不会在 onError
.
OnErrorNotImplementedException
这是我们在工作中的做法。我们没有执行操作,而是创建了一个抽象的 NYTSubscriber,它实现了 onError 和 onCompleted。这样你就可以使用这个订阅者并且只实现 onNext 回调或者你可以在必要时覆盖 onError 和 onCompleted
public abstract class NYTSubscriber<T> extends Subscriber<T> {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
}
这是另一种可能的解决方案,您可以定义 onNext 和 Throwable(同时您不能丢失 lambda 语法):
.subscribe(t -> doSomething(t), e -> showError(e));
如果您这样做 '.onErrorResumeNext(Observable.empty())',您的流将在发生错误时完成 - 这就是您的操作永远不会被调用的原因。 您可以使用“.retry()”,当您遇到错误时,您的流将自动重新启动。
如果你使用的是 Kotlin 那么语法就像
.subscribe({success -> doOnSuccess(success)},{error -> doOnError(error)})
当调用 Subscribe 方法但未提供 onError() 回调时出现此错误。 科特林
subscribe(object : DisposableCompletableObserver() {
override fun onComplete() {
// on successful completion }
override fun onError(e: Throwable) {
//error message
}
}
)