如何在RxJava中处理dispose而不产生InterruptedException
在下面的代码中,当调用如何在RxJava中处理dispose而不产生InterruptedException,java,rx-java,rx-java2,interrupted-exception,Java,Rx Java,Rx Java2,Interrupted Exception,在下面的代码中,当调用dispose()时被截断,然后发射器线程被中断(InterruptedException被抛出睡眠方法) Observable obs=可观测。创建(发射器->{ 对于(int i=0;i退出”); emitter.onComplete(); 返回; } 下一步(i); System.out.println(“>calculation=“+i”); 试一试{ 睡眠(1000); }捕捉(中断异常e){ e、 printStackTrace(); } } emitter.o
dispose()
时被截断,然后发射器线程被中断(InterruptedException
被抛出睡眠方法)
Observable obs=可观测。创建(发射器->{
对于(int i=0;i<10;i++){
if(emitter.isDisposed()){
System.out.println(“>退出”);
emitter.onComplete();
返回;
}
下一步(i);
System.out.println(“>calculation=“+i”);
试一试{
睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
emitter.onComplete();
});
一次性的
.subscribeOn(Schedulers.computation())
.subscribe(System.out::println);
试一试{
《睡眠》(2000年);
}捕捉(中断异常e){
e、 printStackTrace();
}
一次性的,一次性的;
从调试会话中,我看到中断源于FutureTask
,在处理过程中被取消。在这里,调用dispose()
的线程将根据运行线程进行检查,如果不匹配,发射器将被中断。线程不同,因为我使用了计算调度程序
有没有办法使dispose不中断这样的发射器,或者它实际上应该如何处理?我看到这种方法的一个问题是,在调用onComplete()
之前,我需要正常完成一个可中断操作(这里由sleep模拟)
对于2.x来说,一个重要的设计要求是不应该忽略任何可丢弃的错误。这意味着无法发出错误,因为下游的生命周期已达到其终端状态,或者下游取消了即将发出错误的序列
因此,您可以将所有内容包装在try/catch中,并正确地发出错误:
Observable<Integer> obs = Observable.create(emitter -> {
try {
// ...
} catch (InterruptedException ex) {
// check if the interrupt is due to cancellation
// if so, no need to signal the InterruptedException
if (!disposable.isDisposed()) {
observer.onError(ex);
}
}
});
Observable<Integer> obs = Observable.create(emitter -> {
try {
// ...
} catch (InterruptedException ex) {
// check if the interrupt is due to cancellation
// if so, no need to signal the InterruptedException
if (!disposable.isDisposed()) {
observer.onError(ex);
}
}
});
RxJavaPlugins.setErrorHandler(e -> {
// ..
if (e instanceof InterruptedException) {
// fine, some blocking code was interrupted by a dispose call
return;
}
// ...
Log.warning("Undeliverable exception received, not sure what to do", e);
});