【问题标题】:Send accumulated requests to webservice - RxJava2将累积的请求发送到 Web 服务 - RxJava2
【发布时间】:2017-02-03 08:23:20
【问题描述】:

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

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

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

【问题讨论】:

  • (1req/sec) 每个用户,我不想在你的服务器的位置。
  • @AnixPasBesoin 我的意思是发送每 1 秒累积的请求,而不是每次用户单击添加按钮时发送。对不起我的英语不好:)

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


【解决方案1】:

您正在寻找debounce运营商:

返回一个镜像源 ObservableSource 的 Observable,除了它丢弃由源 ObservableSource 发出的项目,这些项目在超时值到期之前跟随更新的项目。每次发射时计时器都会重置。

只需将您的点击事件包装到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);
                }
            });
        }
    });
}

并应用该运算符不要忘记在onDestroy(onDestroyView)中取消订阅:

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();
}

【讨论】:

  • 太好了,非常感谢,最后一个问题,是否可以通过将 onClickListener 设置为 debounce observable 来制作自定义视图?提前谢谢你:)
  • 您可以在任何类中包装任何回调。 Observable.create 适用于这种情况。
  • 顺便说一句,我修正了我的答案 - e.setCancelable 移出 onClick 回调。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多