Debounce 使 PublishSubject 只发出一个项目
Debounce makes PublishSubject emit only one item
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();
}
当我向我的 onScrollS 主题添加 .debounce
调用时
accept
方法只被调用一次。
我可以滚动再滚动然后暂停十秒钟,但什么也没有发生。
有人知道为什么吗?
我试过这样的事情:
.debounce((Function<Integer, Observable<Integer>>) value - > {
return Observable.just(value).delay(1, TimeUnit.SECONDS);
})
如果我删除 delay
部分,它会起作用。
这里可能有几个问题:
- 在添加 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
}
});
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();
}
当我向我的 onScrollS 主题添加 .debounce
调用时
accept
方法只被调用一次。
我可以滚动再滚动然后暂停十秒钟,但什么也没有发生。
有人知道为什么吗?
我试过这样的事情:
.debounce((Function<Integer, Observable<Integer>>) value - > {
return Observable.just(value).delay(1, TimeUnit.SECONDS);
})
如果我删除 delay
部分,它会起作用。
这里可能有几个问题:
- 在添加 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
}
});