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

Observable.interval(timeout, interval, TimeUnit.SECONDS)
.flatmap(task - > task)
14
iammini 5 Сен 2016 в 05:27

3 ответа

Лучший ответ

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

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

Здесь наблюдаемое завершится с 42-й попытки

23
m.ostroverkhov 5 Сен 2016 в 05:02

Вы можете остановить 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 секунд наблюдаемое остановится.

5
Ugurcan Yildirim 12 Июл 2017 в 14:28

Приведенный ниже код даст следующий результат:

Starting interval..
Next tick is: 1
Next tick is: 2
Next tick is: 3
Next tick is: 4
Next tick is: 5
Interval complete

Если вы раскомментируете эту строку: "// if (t == 3) dispose ();" он напечатает только следующее:

Starting interval..
Next tick is: 1
Next tick is: 2
Next tick is: 3

Код:

         Observable.interval(1, TimeUnit.SECONDS).take(5).subscribeWith(new DisposableObserver<Long>() {
        @Override public void onStart() {                
            // do whatever might be needed here to run once before
            // the interval begins
            System.out.println("Starting interval..");
        }
        @Override public void onNext(Long t) {
            System.out.println("Next tick is: "+t);
            // if( t==3 ) dispose();
        }
        @Override public void onError(Throwable t) {
            t.printStackTrace();
        }
        @Override public void onComplete() {
            // will be called once when all 5 ticks are completed
            // will NOT be called if dispose() has been called
               System.out.println("Interval complete");
        }
    });
1
Interkot 29 Янв 2020 в 02:12