2017-07-07 4 views
0

Ich bin neu bei RxJava. Ich habe ein Szenario, in dem ich den ersten Login-Webservice (getLoginObservable) aufrufen möchte und bei Erfolg einen anderen Webservice (getFetchDataObservable) aufrufen möchte, um Benutzerinformationen zu erhalten.RxAndroid Anruf ein Netzwerk Anruf nach dem anderen

Ich habe folgenden Code funktioniert, wenn Login erfolgreich ist. Aber ich bin nicht in der Lage, herauszufinden, wie man failure Fall code.

private void doLogin() { 
    emailAddress = editTextUsername.getText().toString(); 
    final String password = editTextPassword.getText().toString(); 
    showProgress(null, getString(R.string.loggingInPleaseWait)); 

    getLoginObservable(editTextUsername.getText().toString(), password) 
      .map(response -> { 
       if (response.result) { 
        getPresenter().saveUserDetails(getContext(), emailAddress, true, response.dataObject.questionId, response.dataObject.question); 
       } 
       return response; 
      }) 
      .flatMap(response -> { 
       return getFetchDataObservable(); 
      }) 
      .subscribe(res -> { 
       dismissProgress(); 
       if (res.result) { 
        saveInformation(password, res); 
       } else { 
        ConstantsMethods.showOkButtonDialog(getContext(), res.message, null); 
       } 
      }, e -> { 
       dismissProgress(); 
       if (e instanceof NoInternetConnectionException) { 
        ConstantsMethods.showOkButtonDialog(getContext(), getString(R.string.noInternetConnection), null); 
       } 
       Log.e(LoginFragment.class.getSimpleName(), e.getMessage()); 
      }); 
} 



    private Observable<WsResponse<SecurityQuestion>> getLoginObservable(String userName, String password) { 
     return Observable.<WsResponse<SecurityQuestion>>create(subscriber -> { 
      getPresenter().doLogin(getActivity(), userName, password, appType, 
        new Callback<Void, WsResponse<SecurityQuestion>>() { 
         @Override 
         public Void callback(final WsResponse<SecurityQuestion> param) { 
          subscriber.onNext(param); 
          return null; 
         } 
        }); 
     }); 
    } 

    private Observable<WsResponse<PatientDataProfile>> getFetchDataObservable() { 
     return Observable.create(subscriber -> { 
      new AfPatientsPresenter().fetchPatientData(getContext(), emailAddress, "", new Callback<Void, WsResponse<PatientDataProfile>>() { 
       @Override 
       public Void callback(WsResponse<PatientDataProfile> param1) { 
        subscriber.onNext(param1); 
        subscriber.onComplete(); 
        return null; 
       } 
      }); 
     }); 
    } 

Wie viel ich RxJava kenne, kann ich herausfinden, dass getLoginObservable(editTextUsername.getText().toString(), password) beobachtbaren Sendeverhalten abzubilden (map(response -> { ... }) und diese Karte Rückkehr Reaktion auf flatmap (flatMap(response -> { ... }) und seine Antwort an Teilnehmer gesendet. Hier bin ich nur verloren, wie kann ich überspringen (zweiter Netzwerkanruf) flatmap flatMap(response -> { ... }, Antwort direkt an den Abonnenten im Falle von Login-Fehler zu senden.

Antwort

1

statt:

.map(response -> { 
       if (response.result) { 
        getPresenter().saveUserDetails(getContext(), emailAddress, true, response.dataObject.questionId, response.dataObject.question); 
       } 
       return response; 
      }) 

können Sie:

flatMap(response-> { 
    if (response.result) { 
     getPresenter().saveUserDetails(getContext(), emailAddress, true, response.dataObject.questionId, response.dataObject.question); 
     return Observable.just(response); 
    } else { 
     return Observable.error(new Exception("Login failed")); // or maybe some LoginFailedException() you can reuse 
    } 
}) 
Verwandte Themen