Оператор RxJava debounce только показывает последнюю эмиссию на Android

Я пытаюсь использовать RxJava на Android, чтобы испустить номер через 1 секунду.

Однако испускается только последний элемент (7).

Что я делаю не так?

private Observable<Integer> getIntegerObservable(){
    return Observable.just(1,2,3,4,5,6,7);
}

getIntegerObservable()
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .debounce(1, TimeUnit.SECONDS)
                    .subscribe(new Observer<Integer>() {
                        @Override
                        public void onSubscribe(Disposable d) {

                        }

                        @Override
                        public void onNext(Integer integer) {
                            textView.setText(textView.getText().toString() + String.valueOf(integer)+"
");
                        }

                        @Override
                        public void onError(Throwable e) {
                            System.out.println(e.getMessage());
                        }

                        @Override
                        public void onComplete() {

                        }
                    });

android,reactive,debounce,

0

Ответов: 2


1

Как говорится в документации

Debounce только испускает элемент из Observable, если определенный промежуток времени прошел без его испускания другого элемента. Он отфильтровывает элементы, испускаемые источником Observable, за которым быстро следует другой испущенный элемент.

Поскольку в вашем случае все элементы испускаются в окне времени. Выполняется только последний элемент, и все остальные элементы отфильтровываются.

Я предполагаю, что вы ищете Delay

Оператор « Задержка» изменяет свой источник. Наблюдается путем приостановки определенного периода времени (указанного вами) перед тем, как испускать каждый элемент источника Observable. Это приводит к сдвигу всей последовательности элементов, исходящих вовремя вовремя, с помощью указанного указанного приращения.

Поэтому вместо этого он должен выглядеть примерно так:

getIntegerObservable()
          .delay(1, TimeUnit.SECONDS)
          .subscribeOn(Schedulers.io())
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe(...);

Вы также должны подумать о вызове delay(..)перед тем, subscribeOn(..)чтобы избежать блокировки основного потока

Оформить заказ эту статью , она объясняет разницу между subscribeOnиobserveOn

ОБНОВИТЬ

Вы можете обернуть CountDownTimer в Observerable. Например:

Observable.create(emitter -> new CountDownTimer(7000, 1000) {

          public void onTick(long millisUntilFinished) {
                 emitter.onNext(millisUntilFinished / 1000);
           }

           public void onFinish() {
                emitter.onComplete();
           }
         }.start())
.doOnNext() //you can log your timer here
.subscribe(); //or here

БОНУС (Просто для удовольствия: D)

RxJava выглядит намного круче с java8

Observable.create(this::startCountDownTimer)
       .doOnNext() //use long value
       .map(String::valueOf) //map to string
       .doOnNext() //use string value
       .doOnComplete() //gets called when the timer is up
       .subscribe(this::handleTick, this::handleError);

Обратный отсчет

private void startCountDownTimer(ObservableEmitter<Long> emitter) {
    new CountDownTimer(7000, 1000) {
        public void onTick(long millisUntilFinished) {
            emitter.onNext(millisUntilFinished / 1000);
        }

        public void onFinish() {
            emitter.onComplete();
        }
    }.start();
}

Метод обращения с ручкой

private void handleTick(String timer) {
    //Update UI
}

Метод обработки ручек

private void handleError(Throwable t) {
    //Log and inform user
}

0

Оператор Debounce фильтрует элементы, испускаемые источником Observable, за которым быстро следует другой испущенный элемент.

В вашем случае номера от 1 до 7 исчисляются в течение секунды. Окно, указанное для отладки, составляет одну секунду. Последний элемент, выпущенный в конце одной секунды, равен 7, и поэтому все остальные элементы отфильтровываются, и вы получаете 7 в качестве вывода.

На следующем рисунке показан случай, когда шесть элементов испускаются последовательно в течение одного таймфрейма. Только шестой элемент пройдет, а другие будут отфильтрованы. Дебюты для 6 предметов

На следующем рисунке показан другой случай, когда 6-й элемент испускается после одного таймфрейма, так что 5-й и 6-й элементы испускаются, а остальные фильтруются. введите описание изображения здесь

Надеюсь, что это поможет, попробуйте сыграть с мраморной диаграммой на сайте документации .

андроид, реактивный, дребезг,
Похожие вопросы
Яндекс.Метрика