在可观察的here和here上调用dispose()
之后,我已经阅读了一些有关崩溃的RxJava2问题。然后,我尝试通过代码重现崩溃:
private String simulateHeavyWork() throws InterruptedException {
Thread.sleep(2000);
return "Done";
}
private void myFunc() {
Disposable disposable = Observable.fromCallable(() -> simulateHeavyWork())
.subscribeOn(Schedulers.io())
.subscribe(System.out::println, throwable -> System.out.println(throwable.getMessage()));
sleep(1000);
disposable.dispose();
sleep(60000);
}
运行代码时,我得到了预期的异常io.reactivex.exceptions.UndeliverableException
。就像上面链接中的讨论一样,RxJava2不会吞噬Throwable,因此我们必须handle this。但是当我尝试使用defer
而不是fromCallable
来创建Observable时,令我惊讶的是,没有发生任何错误。
Disposable disposable = Observable.defer(() -> Observable.just(simulateHeavyWork()))
当我使用Flowable
而不是Observable
时,UndeliverableException
又发生了。
Disposable disposable = Flowable.defer(() -> Flowable.just(simulateHeavyWork()))
因此,在这种情况下,我对defer
和fromCallable
,Flowable
和Observable
之间的区别感到困惑。