如何处理 RxJava 中的 `IllegalArgumentException`?
How to handle the `IllegalArgumentException` in RxJava?
我使用 Retrofit
和 RxJava
进行网络调用,RxBinding
进行视图操作。在注册屏幕中,单击 'Register' 按钮后,我使用 MyApi
服务将信息发布到本地服务器。
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);
调用失败并显示 IllegalArgumentException
,因为我发布的信息无效。
我的主要问题是,在 IllegalArgumentException
之后,我认为 RxJava
会执行 registerUser()#ErrorHandler()
,因为我的 registerUser
服务调用因异常而失败,但它调用 RxView#ErrorHandler()
.
如何make/force registerUser()#ErrorHandler()
处理网络调用期间发生的异常?
糟糕,网络调用并没有因 IllegalArgumentException
而失败,但请求构造本身因 IllegalArgumentException
而失败。
java.lang.IllegalArgumentException: URL "users/" does not contain {email}".
我没有使用 @Field
注释来构造 POST 正文,而是错误地使用了 @Path
注解。
正确定义:
@FormUrlEncoded @POST("users/")
Observable<User> registerUser(@Field("email") String username,
@Field("password") String password, @Field("password_confirmation") String confirmPassword);
我使用 Retrofit
和 RxJava
进行网络调用,RxBinding
进行视图操作。在注册屏幕中,单击 'Register' 按钮后,我使用 MyApi
服务将信息发布到本地服务器。
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);
调用失败并显示 IllegalArgumentException
,因为我发布的信息无效。
我的主要问题是,在 IllegalArgumentException
之后,我认为 RxJava
会执行 registerUser()#ErrorHandler()
,因为我的 registerUser
服务调用因异常而失败,但它调用 RxView#ErrorHandler()
.
如何make/force registerUser()#ErrorHandler()
处理网络调用期间发生的异常?
糟糕,网络调用并没有因 IllegalArgumentException
而失败,但请求构造本身因 IllegalArgumentException
而失败。
java.lang.IllegalArgumentException: URL "users/" does not contain {email}".
我没有使用 @Field
注释来构造 POST 正文,而是错误地使用了 @Path
注解。
正确定义:
@FormUrlEncoded @POST("users/")
Observable<User> registerUser(@Field("email") String username,
@Field("password") String password, @Field("password_confirmation") String confirmPassword);