相关疑难解决方法(0)

HTTP失败:java.net.SocketException:套接字已关闭;不会触发异常处理方法

我有一个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(),但是没有运气。当我从中删除超时设置时OkHttlClientSocketException实际上会引发并捕获,从而释放isLocked变量。我试过handleResponse()用一个try {} catch (Exception e) {}块包装return语句,但是即使SocketException在设置自定义超时时也无法捕获。有任何想法吗?

android rx-java okhttp retrofit2

5
推荐指数
1
解决办法
4283
查看次数

标签 统计

android ×1

okhttp ×1

retrofit2 ×1

rx-java ×1