Debounce заставляет PublishSubject выдавать только один элемент - PullRequest
0 голосов
/ 28 апреля 2020
protected PublishSubject<Integer> onScrollS = PublishSubject.create();

public void onActivityCreated(...) {

        ...

        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(@NotNull RecyclerView recyclerView, int dx, int dy) {
                if (dy == 0) return;
                Log.i("Rx", "onNext(" + dy + ")");
                onScrollS.onNext(dy);
            }
        });
        disposable = onScrollS
                .debounce(200, TimeUnit.MILLISECONDS) // <-- this breaks everything
                .subscribe(this);
    }

    // the Fragment implements Consumer interface
    @Override
    public void accept(Integer integer) throws Exception {
        Log.i("Rx", "Accept: " + integer);
        recyclerViewOnScrolled();
    }

Когда я добавляю .debounce вызов к моему предмету onScrollS, метод accept вызывается только один раз.

Я могу прокручивать и прокручивать, затем делать паузу в течение десяти секунд, и ничего не происходит.

Кто-нибудь знает почему?

Я пробовал что-то вроде этого:

.debounce((Function<Integer, Observable<Integer>>) value - > {
    return Observable.just(value).delay(1, TimeUnit.SECONDS);
})

И это работает, если я удаляю часть delay.

1 Ответ

1 голос
/ 28 апреля 2020

здесь может быть несколько проблем:

  • Подписаться на события прокрутки перед добавлением OnScrollListener
  • Добавить обработчик потока в поток Rx, чтобы быть уверенным, что вы подписываете поток в потоке ввода-вывода и наблюдаете в главном потоке
  • Также вы можете сразу добавить реализацию onNext в метод подписки
    onScrollS
                .debounce(200, TimeUnit.MILLISECONDS)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer dy) throws Exception {
                        // TODO handle scroll event
                    }
                });
...