【问题标题】:Retrofit2 - Request canceled server side are ignoredRetrofit2 - 请求取消的服务器端被忽略
【发布时间】:2017-09-07 12:33:42
【问题描述】:

我正在使用 Retrofit2 和 RxJava2CallAdapter,但我在区分客户端取消的请求和服务器端取消的另一个请求时遇到了问题。

如果我的用户离开发起请求的当前屏幕,请求将被取消,这是预期的行为。

但是,有时我会得到:

HTTP FAILED: java.io.IOException: Canceled 要么 HTTP FAILED: java.net.SocketException: Socket closed

如果服务器取消请求(非常罕见且难以重现),但这些错误不会传输到 DisposableObserver。如果我查看 CallExecuteObservable 的代码,我可以看到如果请求被取消,则 DisposableObserver 中不会触发任何内容(onError() 和 onComplete() 均未触发)。

所以我的问题是:是否有可能有所作为和/或处理这种情况?提前致谢。

【问题讨论】:

  • 您在哪里看到异常?您确定服务器关闭连接,这就是导致异常的原因吗?当你取消请求时,你不会得到onError。
  • 我在使用 HttpLoggingInterceptor 的日志中看到异常。我真的不知道是什么导致了异常,因为没有其他任何事情发生,而且我自己也没有取消请求,我假设请求在服务器端被取消。
  • 重点是退订(即dispose)不会触发onError,所以这个异常很可能是用户离开屏幕时取消。 (可以通过日志拦截器看到)所以一定要检查它(也许发布一些代码),任何其他错误应该(服务器关闭连接)应该触发 onError,为什么你确定你在服务器端有问题?
  • 是的,我知道取消订阅/处置不会触发任何事情。但问题是我没有处理/取消任何东西。只是有时我会得到这两个没有触发任何东西的异常。我有时也会收到一些 SocketTimeoutException,但它们会触发 onError。
  • 我不确定问题出在服务器端,我只是假设它是,因为我在客户端上没有做任何不同的事情,它只是像往常一样启动请求并保持库存正在加载,因为没有调用任何 Observer 方法。

标签: java android rx-java retrofit2 rx-java2


【解决方案1】:

对我有帮助的是替换:

implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'

与:

implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0'

这帮助我解决了这个问题,我每次都会调用 onError()。 更多信息:https://github.com/JakeWharton/retrofit2-rxjava2-adapter

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2019-11-05
    • 2019-06-01
    • 2011-06-01
    • 1970-01-01
    • 2023-03-30
    • 2020-05-26
    相关资源
    最近更新 更多