Поведение Defer и fromCallable в RxJava 2.x - PullRequest
0 голосов
/ 03 июля 2018

Я прочитал некоторые проблемы 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 в этом случае.

...