2015-12-21 307 views
2

我正在使用Okhttp 2.5,2.6,2.7与RxJava和Retrofit 2我用okhttp调用了一些神秘的问题。当我改造呼叫时,我的Okhttp拦截器会在NetworkInterceptor在4到5秒后调用时立即调用。有时超过15秒,并导致SocketTimeoutExcpetion。okhttp调用的神秘问题(SocketTimeException)

请建议,我该怎么做才能解决这个问题。有没有线程阻止我的呼叫被执行?

+0

由于okhttp的这种行为,我陷入了困境......它有任何想办法解决它的方法。 –

+0

您的问题是否已解决 – mjosh

回答

1

OkHttp表现得应该如此。当服务器花费较长的时间来响应时,客户端愿意等待的时间会发生一次SocketTimeoutException,并且它只是放弃了。从OkHttp 2.5(包括新的3.0)开始,默认读取超时时间为10秒,这可以解释为什么在15秒后得到异常。

可以设置自己的超时,让你的服务器有足够的时间作出回应:

OkHttpClient client = new OkHttpClient(); 
client.setConnectTimeout(20, TimeUnit.SECONDS); // connect timeout 
client.setReadTimeout(20, TimeUnit.SECONDS);  // socket timeout 

注意,这并不手柄的例外,它仍然会如果客户没有按”甩t现在在x秒内收到回复。我会确保实际发现异常。这将是一个适合您的重试逻辑的地方。


由于您使用RxJava与改造,只需要添加retry/retryWhen您链捕获并处理SocketTimeoutException错误,甚至在exponential backoff混合。

+0

Roth,谢谢您的回复。我正在使用你提到的配置,也重试的时候。但是,问题是我的网络连接和服务器是稳定的,我得到sockettimeout。我也搜查过这个,有的帖子提示它的ipv6问题,但我们的服务器是ipv4。所以,我不确定这是什么问题。你有没有遇到过这样的问题?我的用户也面临同样的问题。 –