我有一个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();
Run Code Online (Sandbox Code Playgroud)
这是我拥有的连锁请求的简化版本:
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;
}));
}
Run Code Online (Sandbox Code Playgroud)
handleResponse()进行另一个API调用并返回,Observable<Response<Something>>但是,正如我已经说过的,它有时会以失败,HTTP FAILED: java.net.SocketException: Socket closed并且永远不会完成Observable,因此,永远不会调用onError()或onComplete()。我也尝试过onTerminate(),但是没有运气。当我从中删除超时设置时OkHttlClient,SocketException实际上会引发并捕获,从而释放isLocked变量。我试过handleResponse()用一个try {} catch (Exception e) {}块包装return语句,但是即使SocketException在设置自定义超时时也无法捕获。有任何想法吗?