почему doOnComplete выполняется неумеренно независимо от delay () - PullRequest
0 голосов
/ 25 сентября 2018

Я только что написал некоторый пример кода с помощью takeUntil -

final Observable<Integer> stopper = Observable.just(1)
            .doOnComplete(() -> view.append("second stream complete"))
            .delay(500, TimeUnit.MILLISECONDS);

return Observable
            .range(0, 10)
            .zipWith(Observable.interval(100, TimeUnit.MILLISECONDS), (item, interval) -> item)
            .takeUntil(stopper)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .subscribe(view::append);

Так что в идеале пробка испускается через 500 мс и завершает второе наблюдаемое, что и происходит.НО doOnComplete печатает сразу.enter image description here

Как я понимаю из документации - delay сдвигает события вперед во времени - включая полное событие.Так почему же это случилось?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Если вы посмотрите в исходном коде оператора just (а именно ScalarDisposable в ObservableScalarXMap.java), вы увидите, что все, что он делает, - это генерирует одно событие onNext с предоставленным значением и сразу после этогоон генерирует событие onComplete.В вашем примере вы поставили doOnComplete перед delay оператором - поэтому doOnComplete вызывается немедленно, и после этого событие задерживается на 500 мс.

0 голосов
/ 25 сентября 2018

Согласно документации , Observable.just() завершается немедленно - поэтому сообщение будет распечатано прямо сейчас.Если вы хотите, чтобы сообщение было напечатано после задержки, вы должны изменить его следующим образом:

Observable.just(1)
        .delay(500, TimeUnit.MILLISECONDS)
        .doOnComplete(() -> view.append("second stream complete"))
...