【发布时间】:2017-07-09 06:02:09
【问题描述】:
我有一个 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 变量。我尝试用try {} catch (Exception e) {} 块包装handleResponse() return 语句,但即使设置自定义超时,也无法捕获SocketException。有什么想法吗?
【问题讨论】:
-
handleResponse 是否也进行 Retrofit 调用?您将什么定义为“完成可观察的”?任何问题可能是什么,因为您似乎只是在调用的内部 flatMapped 上应用了 doOnError/Completed,因此 - someApiCall() 可能会失败并且您不会捕获它
-
是的,它确实进行了改造调用。正如我所提到的,它是一个简化的链,真正的应该是 originalApiCall (fails) -> apiCallOne -> apiCallTwo -> originalApiCall (这是一个会话更新链)我尝试将 doOnError() 和 doOnTerminate 添加到外部调用中,但是没有运气。问题是所有其他异常都被捕获在链中,除了 Socket 关闭
-
好的,我明白了,那么 SocketException 会发生什么?你怎么知道那是例外?
-
我只是在 logcat 输出中得到一个单行条目,确切地说:“HTTP FAILED: java.net.SocketException: Socket closed”而且它总是会发生,这不是误报。跨度>
-
你能附上logcat吗?
标签: android rx-java retrofit2 okhttp