Как остановить интервал от observable

Я новичок в rxjava, я хочу выполнять задачу опроса каждые 2 секунды в течение 50 раз, также она может завершиться, если какое-то условие встретится в задаче, я пытаюсь использовать Observable.interval но я обнаружил, что нет никакого способа прекратить его, кроме как бросить исключение, есть ли другой оператор для достижения моей цели ? Кстати, эта функциональность работает как API для обеспечения наблюдаемого объекта, поэтому я не могу контролировать подписчика и завершение отсканировать.

Observable.interval(timeout, interval, TimeUnit.SECONDS)
.flatmap(task - > task)

2 ответов


Я думаю Observable.takeUntil(stopPredicate) или Observable.takeWhile(predicate) могу помочь вам:

Observable.interval(timeout, interval, TimeUnit.SECONDS) 
.takeWhile(val -> val < 42)

здесь observable завершится с 42-й попытки


вы можете остановить Observable.interval С помощью takeUntil следующим образом:

Observable.interval(0, 1, TimeUnit.SECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .takeUntil(new Predicate<Long>() {
                @Override
                public boolean test(Long aLong) throws Exception {
                    return aLong == 10;
                }
            })
            .subscribe(new Consumer<Long>() {
                @Override
                public void accept(Long aLong) throws Exception {
                    Log.d(TAG, "Tick: " + aLong);
                }
            });

в этом примере через 10 секунд observable остановится.