如何处理SyncOnSubscribe RxJava中generateState中的错误?
我试图掌握创建SyncOnSubscribe的诀窍,但不太确定如果如何处理SyncOnSubscribe RxJava中generateState中的错误?,java,reactive-programming,rx-java,backpressure,Java,Reactive Programming,Rx Java,Backpressure,我试图掌握创建SyncOnSubscribe的诀窍,但不太确定如果generateState方法在状态初始化期间失败,该怎么办 return Observable.create(new SyncOnSubscribe<MyState, String>() { @Override protected MyState generateState() { return new MyState(); // <---- what if this fai
generateState
方法在状态初始化期间失败,该怎么办
return Observable.create(new SyncOnSubscribe<MyState, String>() {
@Override
protected MyState generateState() {
return new MyState(); // <---- what if this fails?
}
@Override
protected MyState next(MyState state, Observer<? super String> observer) {
// do something with state
}
});
使用上面的
main
函数getEventsOnSubscribe1
和getEventsSyncOnSubscribe
都调用订阅者onError
,但它们会使程序挂起。使用包装异常并手动调用s.onError
的geteventsonsubscribebe2
,程序可以退出。这似乎是一个使用SyncOnSubscribe
处理错误的错误。我会发布一个修复程序soon@akarnokd我可能弄错了,我似乎无法重现我之前看到的内容-程序没有退出可能是由于另一个库生成了守护进程线程。如果我再次看到这个问题,我会在这里回复。谢谢这似乎是处理SyncOnSubscribe
的错误。我会发布一个修复程序soon@akarnokd我可能弄错了,我似乎无法重现我之前看到的内容-程序没有退出可能是由于另一个库生成了守护进程线程。如果我再次看到这个问题,我会在这里回复。谢谢
public static Observable<String> getEventsOnSubscribe1() {
return Observable.create((s) -> {
throw new UnsupportedOperationException("getEvents3");
});
};
/** Like 'getEventsOnSubscribe1' but wrap exception and call onError manually. */
public static Observable<String> getEventsOnSubscribe2() {
return Observable.create((s) -> {
try {
throw new UnsupportedOperationException("getEvents3");
} catch (Exception ex) {
s.onError(ex);
}
});
};
public static Observable<String> getEventsSyncOnSubscribe() {
return Observable.create(new SyncOnSubscribe<Channel, String>() {
@Override
protected Channel generateState() {
System.out.println("SyncOnSubscribe.generateState");
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
protected Channel next(Channel state, Observer<? super String> observer) {
System.out.println("SyncOnSubscribe.next");
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
protected void onUnsubscribe(Channel state) {
System.out.println("SyncOnSubscribe.onUnsubscribe");
throw new UnsupportedOperationException("Not supported yet.");
}
});
}
public static void main(String[] args) throws IOException, TimeoutException {
getEventsOnSubscribe1()
//getEventsOnSubscribe2()
//getEventsOnSyncSubscribe()
.toBlocking()
.subscribe(new Subscriber<String>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onError(Throwable e) {
System.out.println("onError: " + e.getLocalizedMessage());
}
@Override
public void onNext(String t) {
System.out.println("onNext: " + t);
}
});
}