Оператор восстановления RxJava показывает только последнюю версию на Android - PullRequest
0 голосов
/ 25 августа 2018

Я пытаюсь использовать 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)+"\n");
                        }

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

                        @Override
                        public void onComplete() {

                        }
                    });

Ответы [ 2 ]

0 голосов
/ 25 августа 2018

Как сказано в документации

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

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

Полагаю, вы ищете Задержка

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

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

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

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

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

ОБНОВЛЕНИЕ

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

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 голосов
/ 25 августа 2018

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

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

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

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

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

...