我有一个 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/