2016-11-02 17 views
1

RxAndroidの新機能です。ボタンのクリックイベントが機能しなくなった理由を理解したいと思います。 ObservablesでRxBindingとRetrofit 2を使用しています。私は(ログイン後付けサービスからの)エラーを得た場合RxAndroid onErrorの後にボタンのクリックリスナーが機能しなくなる

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のは、細かい実行されますが、その後、クリックイベントはもう発生しません。

私は何か間違っていますが、私は理解できません。改造誤差を処理す​​るより良い方法はありますか?

おかげ

+0

このhttp://stackoverflow.com/questions/40305865/onnext-onerror-callbacks-not-executing-on-second-subscribtionに見てみましょう-android/40313481#40313481 –

+0

私はチェックしましたが解決策ではありません。 – AndroidRuntimeException

+0

です。 OnErrorは、ObservableソースでOnCompleteを呼び出しているため、あなたのサブスクリプションはそれ以上は機能しません。そして、PublishSubjectはそれをしません。 –

答えて

0

両方onErroronCompletedイベントが発生しますRxJavaチェーンのすべてのエラーは、これは仕様です。 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)); 
+0

残念ながらうまくいきません。ありがとう – AndroidRuntimeException

関連する問題