【问题标题】:RxJava take only one event until completedRxJava 只接受一个事件直到完成
【发布时间】:2018-01-16 12:14:41
【问题描述】:

我有一个带有 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.

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

【问题讨论】:

    标签: android rx-java2 rx-android rx-binding


    【解决方案1】:

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

    看看here看完整的解释。

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

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

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

    编辑:

    但你也可以使用过滤器:

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

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

    编码愉快!

    【讨论】:

    • 谢谢,但是连接可能快也可能慢,我怎样才能确保当用户再次点击时,它会为他工作?
    • 这个想法只是为了防止用户多次启动连接。如果您希望用户能够在没有其他连接处于活动状态的情况下进行连接,您应该使用过滤器。
    【解决方案2】:

    使用 take 运算符,例如

    RxView.clicks(binding.btLoginSignIn)
          .take(1)
          .subscribe(o -> login());
    

    【讨论】:

    • 如果我使用 take(),用户将无法输入错误的电子邮件/密码,因为它不再接受点击
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多