1

我是 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 事件。

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

谢谢

4

1 回答 1

1

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

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

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

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));
于 2016-11-02T21:44:27.520 回答