I'm using Retrofit
with RxJava
for the network calls and RxBinding
for view operations. In signup screen, upon clicking 'Register' button I'm posting the info to the local server using the MyApi
service.
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);
The call fails with IllegalArgumentException
since I'm posting an invalid info.
What's my main issue is, upon IllegalArgumentException
I thought RxJava
would execute registerUser()#ErrorHandler()
since my registerUser
service call failed with exception but instead it calls RxView#ErrorHandler()
.
How can I make/force registerUser()#ErrorHandler()
to take care of the exception occurred during the network call?
My bad, the network call doesn't fail with IllegalArgumentException
but the request construction itself failed with IllegalArgumentException
.
java.lang.IllegalArgumentException: URL "users/" does not contain {email}".
Instead of using @Field
annotation for constructing the POST body , I'd mistakenly used @Path
annotation.
The correct definition:
@FormUrlEncoded @POST("users/")
Observable<User> registerUser(@Field("email") String username,
@Field("password") String password, @Field("password_confirmation") String confirmPassword);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With