android - HTTP 失败 : java.net.SocketException:套接字已关闭;不会启动异常处理方法

标签 android rx-java retrofit2 okhttp

我有一个 RxJava 链请求应该释放一些 onError() 或 onComplete() 的锁,所以,基本上,我的问题是:当我为我的 OkHttpClient 设置读取、连接和写入超时时,我没有得到期望的行为。我正在使用 Retrofit2 和 OkHttp3.6.0 这是我的简化客户端:

OkHttpClient.Builder builder = new OkHttpClient.Builder()
           .readTimeout(30, TimeUnit.SECONDS)
           .connectTimeout(30, TimeUnit.SECONDS)
           .writeTimeout(30, TimeUnit.SECONDS)
OkHttpClient okHttpClient = builder.build();

这是我的链请求的简化版本:

public <T extends Response> Observable<T> doSomething(Observable<T> base) {
    isLocked = true;
    return someApiCall()
               .flatMap(apiResponse -> handleResponse(apiResponse, base)
                   .doOnError(throwable -> {
                       isLocked = false;
                   })
                   .doOnCompleted(() -> {
                       isLocked = false;
                   }));
}

handleResponse()进行另一个 API 调用并返回 Observable<Response<Something>>但是,正如我所说,它有时会因 HTTP FAILED: java.net.SocketException: Socket closed 而失败。而且它永远不会完成 Observable,因此永远不会调用 onError() 或 onComplete()。我也试过 onTerminate() ,但没有运气。当我从 OkHttlClient 中删除超时设置时, SocketException实际上被抛出并被捕获,释放了 isLocked多变的。我试过包装 handleResponse()带有 try {} catch (Exception e) {} 的返回语句 block ,但即使那样也没有捕捉到 SocketException设置自定义超时时。有什么想法吗?

最佳答案

我使用构建器设置的选项 retryOnConnectionFailure(true) 解决了 Android 中的这种情况。

假设 Retrofit 2 刚刚接收到 OkHttpClient 对象。

关于android - HTTP 失败 : java.net.SocketException:套接字已关闭;不会启动异常处理方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42336416/

相关文章:

java - 如何使用 Vitamio 播放加密视频文件 (.mpg)?

android - 覆盖 RxAndroid 调度程序以进行测试

android - Kotlin 协程 Flow 中 RxJava Observable 和 FlatMap 的等价物是什么

android - 改造后请求结构

android - 如何检查 firebase 服务是否可用?

android - 将 android gradle 插件更新到 4.1.0 后,afterEvaluate 不起作用

java - 我们可以在App模块中使用库模块的资源吗?

operators - RxJava 在函数中返回订阅值

retrofit - 如何设置动态文件名?

android - 无法在改造的错误主体中获得错误响应