gpt4 book ai didi

android - 如何在 retrofit 2 + rx-android 上注册全局错误转换器?

转载 作者:行者123 更新时间:2023-11-30 01:37:55 27 4
gpt4 key购买 nike

我的服务器在一切正常时返回域 java 对象,但在出现错误时返回 ErrorResponse 对象。 (编辑:服务器返回 http 代码 40x,以及带有错误信息的 json 正文)如何在 retrofit 2 + rx-android 上注册全局错误转换器以避免在每次调用时都做同样的事情?

目前我在每次通话时都这样做:

MyApiRx.doSomething(params)
.subscribeOn(Schedulers.io())
.subscribe(response -> responseHandler(),
throwable -> {
HttpException err = (HttpException) throwable;
Converter<ResponseBody, ErrorResponse> ec = retrofit.responseConverter(ErrorResponse.class, new Annotation[]{});
ErrorResponse errorResponse = ec.convert(err.response().errorBody());
});

也许我应该写一个自定义的 CallAdapterFactory 来自动处理这个问题,并返回一个带有 onError(ErrorResponse err) 的 Observable 而不是常规的 onError(Throwable t)?

关于如何实现这一点有什么想法吗?

这是个好主意吗?

最佳答案

Observable 有几个有趣的方法你可以使用。特别是你应该看看这两个:

onErrorResumeNext(Func1<Throwable, Observable> resumeFunction)

doOnError(Action1<Throwable> onError)

因为我没有看到(在你的例子中)需要另一个 Observable为了获得对流的控制,后者可能更适合您。

你可以做的是创建一个类来包装你的错误处理程序(例如像这样):

public static class Response {
private static final Action1<Throwable> ERROR_HANDLER = new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
HttpException err = (HttpException) throwable;
Converter<ResponseBody, ErrorResponse> ec = retrofit.responseConverter(ErrorResponse.class, new Annotation[]{});
ErrorResponse errorResponse = ec.convert(err.response().errorBody());
}
};

public static Action1<Throwable> handleError() {
return ERROR_HANDLER;
}
}

然后调用您的 api:

MyApiRx.doSomething(params)
.subscribeOn(Schedulers.io())
.doOnError(Response.handleError())
.subscribe(response -> responseHandler());

关于android - 如何在 retrofit 2 + rx-android 上注册全局错误转换器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34882453/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com