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记录的解决方案可能更好。如果您的问题相同,我会使用该解决方案,或者发布一个新问题。