android 调用restful,在Android中使用RxJava处理Restful Api格式的错误响应

本文介绍了如何通过查看RxJavaCallAdapterFactory的代码,解决在使用RxJava创建Observables时遇到的问题。作者发现当返回类型为Observable<Observable<Observable>>时,可以在OnErrorAction中捕获HttpException,从而获取到Response对象并解析错误Body。定义了ResponseError类来处理错误响应,并创建了一个ErrorAction抽象类,以便在链式操作中优雅地处理错误。通过这种方式,可以在订阅时分别处理业务数据和错误情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我通过查看 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

}

});

记录在此,希望能帮到后面的朋友!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值