您的位置:首页 > 其它

Retrofit 使用flatmap操作符时处理错误、异常

2016-08-05 15:33 399 查看
在实际项目(Retrofit+RxJava框架)中,有时需要先登录,获取token后再去获取用户信息,此时我们使用flatmap操作符比较好。

在RESTResult对象里,包括请求返回的状态:失败还是成功,错误码,User对象等等,我们根据接口先定义一个返回数据Response实体类:

public class Response<T> extends Entity {

public boolean isSuccess() {
return infoCode == 1;
}
public boolean isTokenExpired() {
return infoCode == -1;
}

public int infoCode;
public String message;
public int size;
public T data;
}


逻辑处理:

登录失败,直接触发onError;

登录成功,根据获得的token请求用户信息接口最终调用subscribe的onNext事件;

如下代码所示:

private void login(final String phone , final String password){
APIWrapper.getInstance().login(phone, password)
.flatMap(new Func1<Response<TokenEntity>, Observable<Response<UserInfo>>>() {
@Override
public Observable<Response<UserInfo>> call(Response<TokenEntity> response) {
if (response.isSuccess()) {
TokenEntity tokenEntity = response.data;

return APIWrapper.getInstance().getUserInfo(tokenEntity.token);
} else {
return Observable.error(new ApiException(response.message));
}
}
})
.compose(new RxHelper<Response<UserInfo>>(getString(R.string.wait_to_login_tip)).io_main(LoginActivity.this))
.subscribe(new RxSubscriber<Response<UserInfo>>(this,USER_LOGIN) {
@Override
public void _onNext(Response<UserInfo> response) {
if (response.isSuccess()) {
UserInfo userInfo = response.data;
if (null != userInfo) {
AppApplication.getInstance().saveUserInfo(userInfo);
}
finish();
}
}

@Override
public void _onError(String msg) {
ToastUtils.show(LoginActivity.this, msg);
}
});
}


根据上面代码,登陆失败后的处理很关键:

if (response.isSuccess()) {
TokenEntity tokenEntity = response.data;

return APIWrapper.getInstance().getUserInfo(tokenEntity.token);
} else {
return Observable.error(new ApiException(response.message));


无论何种原因造成的登陆失败,都应跟用户提示。

ApiException代码:

public class ApiException extends RuntimeException {

public static final int USER_NOT_EXIST = 100;
public static final int WRONG_PASSWORD = 101;
public static final int ERROR = 2001;

public ApiException(int resultCode) {
this(getApiExceptionMessage(resultCode));
}

public ApiException(String detailMessage) {
super(detailMessage);
}

/**
* 由于服务器传递过来的错误信息直接给用户看的话,用户未必能够理解
* 需要根据错误码对错误信息进行一个转换,在显示给用户
* @param code
* @return
*/
private static String getApiExceptionMessage(int code){
String message ;
switch (code) {
case USER_NOT_EXIST:
message = "该用户不存在";
break;
case WRONG_PASSWORD:
message = "密码错误";
break;
default:
message = "未知错误";

}
return message;
}

}

通过RxJava的链式操作,结合恰当的操作符,不仅可以把正常的数据源发射给观察者,同时也可以将错误异常数据源发射给观察者,RxJava比想象中的更强大!

更多参考:Retrofit+RxJava 优雅的处理服务器返回异常、错误
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: