我通过查看 RxJavaCallAdapterFactory 这个类的代码,自己解决了这个问题。
我发现当使用RxJava创建observables时,可以有三种不同的返回类型
Observable
Observable>
Observable>
而Observable这种返回类型的OnErrorAction里的throwable参数是HttpException这种类型的,这个HttpException里有 Response 对象,自然的,就可以拿到 errorBody 来进行我所想要的处理了。
我定义了一个类 ResponseError来接收错误消息的响应。
public class ResponseError {
public int status;
public String message;
// getter 和 setter 方法略
// 主要是这个方法
public static ResponseError handle(Throwable throwable) {
ResponseError error = null;
if (throwable instanceof HttpException) {
HttpException exception = (HttpException) throwable;
try {
error = new Gson().fromJson(exception.response().errorBody().string(),
ResponseError.class);
} catch (Exception e) {
if (e instanceof JsonParseException) {
error = new ResponseError(HTTP_SERVER_ERROR, "服务器出错");
} else {
error = new ResponseError(HTTP_UNKNOWN_ERROR, "未知错误");
}
}
} else {
error = new ResponseError(HTTP_UNKNOWN_ERROR, "未知错误");
}
if (BuildConfig.DEBUG) {
throwable.printStackTrace();
}
return error;
}
}
然后再定义了一个Action:
public abstract class ErrorAction implements Action1 {
@Override
public void call(Throwable throwable) {
ResponseError error = ResponseError.handle(throwable);
call(error);
}
public abstract void call(ResponseError error);
}
这样,在使用 Rxjava 链式操作的时候就可以这样了
mRestApiClient.accountService()
.login(username, password)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1>() {
@Override
public void call(List businesses) {
// do something
}
}, new ErrorAction() {
@Override
public void call(ResponseError error) {
// do something
}
});
记录在此,希望能帮到后面的朋友!