【问题标题】:Button click listener stop working after RxAndroid onErrorRxAndroid onError 后按钮单击侦听器停止工作
【发布时间】:2016-11-02 15:18:50
【问题描述】:

我是 RxAndroid 新手,我想了解为什么按钮点击事件停止工作。我正在使用带有 Observables 的 RxBinding 和 Retrofit 2。

Subscription loginButtonSubscription = RxView.clicks(loginBtn)
        .throttleFirst(Constants.CLICK_THRESHOLD_MILLIS, TimeUnit.MILLISECONDS)
        .flatMap(aVoid -> authApi.login(new LoginUserRequest(emailEditText.getText().toString(), passwordEditText.getText().toString())))
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(verifyEmailResponse -> Log.i("TEST", "onNext: " + verifyEmailResponse.success),
                throwable -> handleError(throwable));

如果我收到错误(来自登录改造服务),则方法 handleError 会正常执行,但之后不再触发 click 事件。

我做错了什么,但我无法理解。有更好的方法来处理改造错误?

谢谢

【问题讨论】:

  • 我已经检查过但不是解决方案。
  • 是的。因为 OnError 在源 Observable 中调用 OnComplete,所以您的订阅不再“有效”。而 PublishSubject 不会这样做。
  • @AndroidRuntimeException 你找到解决方案了吗?当我尝试一次进行许多 API 调用(Retrofit + RxAndroid)时,有时我的按钮无法再点击了!

标签: android rx-android rx-binding


【解决方案1】:

RxJava 链中的任何错误都会导致onErroronCompleted 事件,这是设计使然。一旦调用了 onCompleted 事件,您将不再被订阅,因此您会看到这种行为。

在您的情况下,即使 Retrofit 返回错误,您也希望保持按钮正常工作,这意味着值得您研究 RxJava 中的 retry() 运算符。

示例但不保证您需要什么:

Subscription loginButtonSubscription = RxView.clicks(loginBtn)
    .throttleFirst(Constants.CLICK_THRESHOLD_MILLIS, TimeUnit.MILLISECONDS)
    .flatMap(aVoid -> authApi.login(new LoginUserRequest(emailEditText.getText().toString(), passwordEditText.getText().toString())))
    .doOnError(this::handleLoginError)
    .retry()
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(
        verifyEmailResponse -> Log.i("TEST", "onNext: " + verifyEmailResponse.success),
        throwable -> handleError(throwable));

【讨论】:

    猜你喜欢
    • 2022-07-08
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多