如何在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);
});