Я прочитал некоторые проблемы RxJava2 о сбое после вызова dispose()
в Observable здесь и здесь . Затем я попытался воспроизвести сбой по коду:
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, поэтому нам нужно обработать это . Но когда я попытался использовать defer
вместо fromCallable
для создания Observable, меня удивило, что ошибки не было.
Disposable disposable = Observable.defer(() -> Observable.just(simulateHeavyWork()))
Меня снова удивляет, когда я использую Flowable
вместо Observable
, UndeliverableException
произошло снова.
Disposable disposable = Flowable.defer(() -> Flowable.just(simulateHeavyWork()))
Так что меня смущает разница между defer
и fromCallable
, Flowable
и Observable
в этом случае.