Android 如何使用RxJava来降低按钮';谁的水龙头?

Android 如何使用RxJava来降低按钮';谁的水龙头?,android,rx-java,rx-java2,Android,Rx Java,Rx Java2,QA团队执行的测试之一是疯狂地点击某个按钮,以确保只执行一个事件。是否可以使用RxJava来确保这种行为?我试着阅读RxJava,但我发现这很难理解。此外,我不知道如何从button的onClickListener发出事件—我认为所有事情最终都会创建一个新的观察者,而不是发出一个新事件。实现它的最简单方法是限制事件。您可以使用:您基本上定义了一个只会触发一个事件的窗口 如果使用,您可以通过单击创建流,您可以有如下内容: RxView.clicks(button).throttleFirst(60

QA团队执行的测试之一是疯狂地点击某个按钮,以确保只执行一个事件。是否可以使用RxJava来确保这种行为?我试着阅读RxJava,但我发现这很难理解。此外,我不知道如何从button的onClickListener发出事件—我认为所有事情最终都会创建一个新的观察者,而不是发出一个新事件。

实现它的最简单方法是限制事件。您可以使用:您基本上定义了一个只会触发一个事件的窗口

如果使用,您可以通过单击创建流,您可以有如下内容:

RxView.clicks(button).throttleFirst(600, TimeUnit.MILLISECONDS)
    .subscribe(empty -> { // your action});
所以,在你点击你的按钮后,在600毫秒内,任何其他的点击都不会起任何作用,你可以防止双重动作

编辑:如果您不能使用
RxBinding
,您可以通过以下方式创建自己的
可观察

Observable<View> clickEventObservable = Observable.create(new Observable.OnSubscribe<View>() {
        @Override
        public void call(final Subscriber<? super View> subscriber) {
            mButton.setOnClickListener(v -> {
                if (subscriber.isUnsubscribed()) return;
                subscriber.onNext(v);
            });
        }
    });
Observable clickEventObservable=Observable.create(newobservable.OnSubscribe()){
@凌驾

public void call(final Subscriber对于您不需要使用RxJava的情况,您可以简单地使用实例变量作为指示符,使用它您可以检查上一次单击是否正在进行操作,如果是,则忽略事件。

我将混合使用
debounce()
仅在用户完成输入后触发。然后只接受
first()
事件,并使用
repeat()
保持订阅状态。最后两个一起将确保在观察到另一个单击事件之前处理了您的单击事件

RxView.clicks(button)
      .debounce(300, TimeUnit.MILLISECONDS)
      .first()
      .repeat()
      .subscribe();

您只需自行处理取消订阅此
Observable
,可能使用
repeatWhen()
相反,因为完成将不再取消您的订阅。

这是我到目前为止一直在做的事情,但是,由于我们正在迁移到一个反应式体系结构,并且我们想要一个更简单的代码来阅读,我认为Rx是最好的方式。很抱歉,如果我没有在问题中明确说明,我无法用RxBinding重现这一点,因为
first()
需要一个参数,我不确定应该传递给它什么。这是Rx2特有的。
firstElement()将使用
。明白了!非常感谢!这是完美、简单和高效的。我唯一的问题是RxBinding是API 17+,不幸的是,我们仍然需要支持API14:/您还可以查看
RxView.click()实现:非常感谢,我将查看一下!