gpt4 book ai didi

android - Retrofit rxJava 不会针对 500 个内部服务器错误调用 onError

转载 作者:行者123 更新时间:2023-11-29 15:02:31 26 4
gpt4 key购买 nike

在android上,我通过retrofit进行服务器调用,服务器有时可以返回500响应。

订阅者中没有调用 onError 是否有原因?

            .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<Response<Void>>() {
@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {
if (isViewAttached()) {
getView().onError(e);
}
}

@Override
public void onNext(Response<Void> response) {
response.code() <-- why would 500 here not get routed to the onError instead?
}
});

最佳答案

这部分取决于您的配置,部分取决于您如何定义调用,但这一切都将归结为 2 Observables 之一.

如果你查看源代码,你会发现如果你的调用返回 Response<Foo> 类型Retrofit 将在内部创建 CallEnqueueObservable<Foo>CallExecuteObservable为您的来电。在 adapt 中查看方法。对于 RxJava 1,这是类似的,但可观察量的调用方式不同。无论如何,内部工作方式是完全相同的。调用被执行并且 onNextresponse 调用实例。

如果你看看它在 Retrofit 内部是如何工作的的代理机制,总会有一个response即使响应是 Http 错误也是如此。这意味着调用 onNext即使响应本身是一个 http 错误,仍然会发生。您可以看看parseReponse方法,如您所见,如果状态代码为 500,则不会抛出异常。

回到可观察量,只有当出现异常时,订阅者的 onError 才会出现。叫做。请记住,如果状态代码为 500,则不会引发异常。

获取您的onError要触发非 2XX http 错误代码,有不同的方法,但一种可能的方法是(如果您负担得起)让您的调用返回 Observable<Foo>而不是Observable<Response<Foo>> .

这将使 Retrofit 在内部使用不同的可观察量,确保调用您的订阅者的 onError当出现 http 错误以及异常时。

关于android - Retrofit rxJava 不会针对 500 个内部服务器错误调用 onError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42284557/

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