0
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零件,它会起作用。

4

1 回答 1

1

这里可能有几个问题:

  • 在添加 OnScrollListener 之前订阅滚动事件
  • 将线程处理程序添加到 Rx 流以确保您在 IO 线程上订阅流并在主线程上观察
  • 您也可以立即在 subscribe 方法中添加 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
                    }
                });
于 2020-04-28T19:52:51.423 回答