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()不抛的方法OnErrorNotImplementedException在onError.
Fir*_*enk 11
这是另一种可能的解决方案,你可以定义onNext和Throwable(也就是你不能松散lambda语法):
.subscribe(t -> doSomething(t), e -> showError(e));
Run Code Online (Sandbox Code Playgroud)
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)
如果您使用的是Kotlin,那么语法就像
.subscribe({success -> doOnSuccess(success)},{error -> doOnError(error)})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11744 次 |
| 最近记录: |