0

我有一个带有 Observable 的登录屏幕,它在电子邮件和密码有效时发出项目,然后我订阅启用或禁用登录按钮。
现在,我想要一种方法来避免多次单击登录按钮(避免多次调用 web 服务并在登录后打开多个活动)。

我尝试使用 doOnNext() 禁用按钮,但它与我的验证冲突(我最终无法启用按钮)

我的代码:

InitialValueObservable<CharSequence> emailChangeObservable = RxTextView.textChanges(binding.tietLoginLogin);
InitialValueObservable<CharSequence> passwordChangeObservable = RxTextView.textChanges(binding.tietLoginPassword);

Observable<Boolean> infoValidStream = Observable.combineLatest(emailChangeObservable, passwordChangeObservable, (email, password) -> {
            boolean validEmail = email.length() > 3 && email.toString().contains("@");
            boolean validPass = password.length() > 1;
            return validEmail && validPass;
        });

        infoValidStream.subscribe(validEmailAndPass -> binding.btLoginSignIn.setEnabled(validEmailAndPass));

        RxView.clicks(binding.btLoginSignIn)
              .subscribe(o -> login()); // do the request to the webservice and return a Single<User> if success.

我怎样才能实现这种行为?

4

2 回答 2

0

您应该使用该debouce方法。除非经过一段时间,否则它将使您的 observable 不会发出新项目。您可以根据需要设置此时间跨度。

这里查看完整的解释。

您可以通过以下方式使用 debounce 是您的代码:

RxView.clicks(binding.btLoginSignIn)
              .debounce(400, TimeUnit.MILLISECONDS)
              .subscribe(o -> login());

这将避免用户在一秒钟内多次启动连接。

编辑:

但您也可以使用过滤器:

RxView.clicks(binding.btLoginSignIn)
              .filter { !connection.isActive() }
              .subscribe {login()};

它是用 Kotlin 编写的,抱歉我对 Java 有点生疏,但这就是逻辑。您将需要一些方法来了解连接是否仍处于活动状态。

快乐编码!

于 2018-01-16T19:08:19.393 回答
-1

使用 take 运算符,例如

RxView.clicks(binding.btLoginSignIn)
      .take(1)
      .subscribe(o -> login());
于 2018-01-16T12:38:24.207 回答