2015-11-05 18 views
5

Ich verwende Retrofit mit RxJava für die Netzwerkanrufe und RxBinding für Ansicht Operationen. Im Anmeldungsbildschirm, wenn ich auf "Registrieren" klicke, poste ich die Informationen auf dem lokalen Server unter Verwendung des MyApi Dienstes.Wie behandelt man die `IllegalArgumentException` in RxJava?

SignupActivity.class

mCompositeSubscription.add(RxView.clicks(mRegisterButton).debounce(300, TimeUnit.MILLISECONDS). 
      subscribe(view -> { 
       registerUser(); 
      }, e -> { 
       Timber.e(e, "RxView "); 
       onRegistrationFailed(e.getMessage()); 
      })); 

private void registerUser() { 
mCompositeSubscription.add(api.registerUser(mEmail, 
     mPassword, mConfirmPassword) 
     .subscribe(user -> { 
      Timber.d("Received user object. Id: " + user.getUserId()); 
     }, e -> { 
      Timber.e(e, "registerUser() "); 
      onRegistrationFailed(e.getMessage()); 
     })); 
    } 

MyApi.class

public Observable<User> registerUser(String username, String password, String confirmPassword) { 
    return mService.registerUser(username, password, confirmPassword) 
     .compose(applySchedulers()); 
    } 

    @SuppressWarnings("unchecked") <T> Observable.Transformer<T, T> applySchedulers() { 
    return observable -> observable.subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()); 
    } 

MyService.class

@FormUrlEncoded @POST("users/") 
    Observable<User> registerUser(@Path("email") String username, 
     @Path("password") String password, @Path("password_confirmation") String confirmPassword); 

Der Aufruf scheitert mit IllegalArgumentException, da ich eine ungültige Info poste.

Was mein Hauptproblem ist, ist, auf IllegalArgumentException Ich dachte RxJavaregisterUser()#ErrorHandler() ausführen würde, da mein registerUser Service-Aufruf mit Ausnahme gescheitert, sondern nennt es RxView#ErrorHandler().

Wie kann ich registerUser()#ErrorHandler() machen/erzwingen, um auf die während des Netzwerkaufrufs aufgetretene Ausnahme zu achten?

+2

Was der Stacktrace der Ausnahme. Es ist möglich, dass es passiert, bevor RxJava überhaupt beteiligt ist. – akarnokd

+0

Welcher Typ ist "e"? Vielleicht ist es nicht allgemein genug, um alle Ausnahmen zu erfassen? – Yoshkebab

Antwort

2

Mein Fehler, der Netzwerkaufruf schlägt nicht mit IllegalArgumentException fehl, aber die Anfrageaufbau selbst ist mit IllegalArgumentException fehlgeschlagen.

java.lang.IllegalArgumentException: URL "users/" does not contain {email}". 

Statt mit @Field Anmerkung für den POST-Körper konstruiert, würde ich verwende fälschlicherweise @Path Anmerkung.

Die richtige Definition:

@FormUrlEncoded @POST("users/") 
Observable<User> registerUser(@Field("email") String username, 
     @Field("password") String password, @Field("password_confirmation") String confirmPassword); 
Verwandte Themen