我有一个rxjava链请求,该请求应该发布一些锁定oneror()或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
而失败,并且永远不会完成可观察到的,因此,OnError()或OnComplete()或OnComplete()从未被调用。我也尝试过Onterminate(),但没有运气。当我从OkHttlClient
中删除超时设置时,SocketException
实际上被抛出并捕获,以释放isLocked
变量。我尝试用handleResponse()
块将CC_7返回语句包装,但即使设置自定义超时时,也不会捕获SocketException
。有什么想法吗?
i在Android中解决了这种情况,并使用构建器设置了retryonConnectionFailure(true)。
鉴于Raturofit 2仅接收OKHTTPCLIENT对象。
在Retrofit 2中,HTTP层以下/上方的例外不是Response<?>
,而是通过onError
进行的实际例外。
在您的情况下,您应该将doOnError
/doOnCompleted
移出flatMap
;就像现在一样,他们仅响应handleResponse
中生成的错误 - 但是如果someApiCall
返回可观察到的错误,则该方法不会调用。
事实证明,该请求已取消订阅,这导致了HTTP FAILED: java.net.SocketException: Socket closed
错误的外观,因此,解决方案只是将此代码添加到链条:
.doOnUnsubscribe(() -> {
isLocked = false;
})
我仍然不明白为什么自定义超时值触发了SocketException
,但是我想插座正在等待超时到期,关闭或完成请求并关闭,但是它被unsubscribe
打断了因此意外关闭。