按钮单击侦听器在RxAndroid onError之后停止工作

时间:2016-11-02 15:18:50

标签: android rx-android rx-binding

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

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

我做错了但我不明白。有更好的方法来处理改造错误吗?

由于

1 个答案:

答案 0 :(得分: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));