将累积的请求发送到webservice - RxJava2

时间:2017-02-03 08:23:20

标签: android rx-java reactive-programming rx-android rx-java2

我在我的应用程序中添加按钮以允许用户将项目添加到列表中,如果用户单击添加按钮我没有立即转到Web服务请求,我希望累积请求并每1秒发送一次总点击次数。而不是每次用户点击添加按钮时发送请求。

我看到RxSearchView实现了类似的东西。我检查了代码太复杂了

我需要一些帮助,我应该从哪里开始这样的问题?或者任何现成的解决方案?

1 个答案:

答案 0 :(得分:3)

您正在寻找debounce运营商:

  

返回一个镜像源ObservableSource的Observable,除了它在超时值到期之前丢弃源ObservableSource发出的后跟更新项的项。计时器会重置每次发射。enter image description here

只需将点击事件包装到Observable

Observable<Object> getButtonObservable(final Button button) {
    return Observable.create(new ObservableOnSubscribe<Object>() {
        @Override
        public void subscribe(final ObservableEmitter<Object> e) throws Exception {
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    e.onNext(new Object()); //instead of Object you can use any data, e.g. derived from View tag
                }
            });
            e.setCancellable(new Cancellable() {
                @Override
                public void cancel() throws Exception {
                    button.setOnClickListener(null);
                }
            });
        }
    });
}

并应用该运营商不要忘记取消订阅onDestroyonDestroyView):

Button addButton;
Disposable addButtonDisposable;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    getButtonObservable(addButton)
            .doOnSubscribe(new Consumer<Disposable>() {
                @Override
                public void accept(Disposable disposable) throws Exception {
                    addButtonDisposable = disposable;
                }
            })
            .debounce(1, TimeUnit.SECONDS)
            ... //make request using flatMap or doOnNext, and subscribe
}

@Override
protected void onDestroy() {
    super.onDestroy();
    addButtonDisposable.dispose();
}