Error handling RxJava:在未完成/取消订阅的情况下调用OneError

Error handling RxJava:在未完成/取消订阅的情况下调用OneError,error-handling,rx-java,Error Handling,Rx Java,我有下面的代码(*),它使用递归调用提供的可观察对象的调度程序实现轮询 (*)灵感来源于 当我只将onNext事件传递给订阅服务器时,此功能正常工作。但是当我将onError事件传递给订阅者时,就会调用unsubscribe事件,这反过来会终止调度程序 我还想将错误传递给订阅者。有什么办法可以做到这一点吗 公共可观察观察(){ return Observable.create(新的PollingSubscriberAction(service.getStatusObservable(),5,Ti

我有下面的代码(*),它使用递归调用提供的可观察对象的调度程序实现轮询

(*)灵感来源于

当我只将
onNext
事件传递给订阅服务器时,此功能正常工作。但是当我将
onError
事件传递给订阅者时,就会调用unsubscribe事件,这反过来会终止调度程序

我还想将错误传递给订阅者。有什么办法可以做到这一点吗

公共可观察观察(){
return Observable.create(新的PollingSubscriberAction(service.getStatusObservable(),5,TimeUnit.SECONDS));
}
私有类PollingSubscriberAction实现了Observable.OnSubscribe{
私人认购;
私人认购;
private Scheduler.Worker-Worker=Schedulers.newThread().createWorker();
私人可观察;
私生活时间长;
私人计时单位;
公众投票订阅(最终可观测、长延迟时间、时间单位){
这个。可观察的=可观察的;
this.delayTime=延迟时间;
这个。单位=单位;
}
@凌驾

公开作废通知(最终订户onError和onCompleted都是终止事件,这意味着在任何事件发生后,您的Observable不会发出任何新事件。为了吞下/处理错误情况,请参阅错误运算符-。此外,为了实现轮询,您可能会利用此事件-

,因此我已经使用此事件有一段时间了e、 我认为你这样做是不可能的。调用
onError
onCompleted
终止流,翻转
SafeSubscriber
包装中的
done
标志,没有办法重置它

我可以看到两个选项可用-我认为这两个都不是特别优雅,但会起作用

1-
UnsafeSubscribe
。可能不是最好的主意,但它很有效,因为它不是将您的
订阅者
包装在
SafeSubscriber
中,而是直接调用它。最好阅读,看看这对您是否合适。或者,如果您觉得有冒险精神,请编写自己的
SafeSubscriber
,在那里您可以重置完成标志或类似。根据您的示例,调用如下命令:

observe.unsafeSubscribe(...)
2-实现类似的功能。我很感激它是用C#编写的,但它应该是可读的。简单地说,你想创建一个
类,然后调用
onError
,而不是调用
onNext
并设置对的异常端。你的订阅者必须更聪明地检查每一个异常端您可能需要在源
可观察的
可观察的
之间进行一些数据转换,但我不明白为什么它不起作用

如果有人有别的方法,我真的很想看看

希望这有帮助


Will

正如@Will所指出的,如果不终止observable,就不能直接调用
onError
。因为只能调用
onNext
,所以我决定使用a将值和可丢弃项包装在单个对象中

导入rx.*;
导入rx.functions.Action0;
导入rx.schedulers.schedulers;
导入rx.subscriptions.subscriptions;
导入java.util.concurrent.TimeUnit;
公共类轮询可观测{
公共静态可观察创建(可观察、长延迟时间、时间单位){
返回可观察的。创建(新的订阅(可观察的,延迟时间,单位));
}
私有静态类OnSubscribePolling实现了Observable.OnSubscribe{
私人认购;
私人认购;
private Scheduler.Worker-Worker=Schedulers.newThread().createWorker();
私人可观察;
私生活时间长;
私人计时单位;
私有布尔值isUnsubscribed=false;
公开订阅(最终可观测、长延迟时间、时间单位){
这个。可观察的=可观察的;
this.delayTime=延迟时间;
这个。单位=单位;
}
@凌驾

public void call(final subscriber)非常喜欢使用通知类,比使用Pair等更干净。您能举一个unsafeSubscribe()的例子吗?一个简单的方法调用并不能帮助解决问题。@Alexandr这个答案已经有一年了,API从那时起已经有了很大的变化,所以这可能不再有效。此外,OP记录的解决方案可能更好。如果您的问题相同,我会使用该解决方案,或者发布一个新问题。