我在RxJava和Retrofit 2中使用Okhttp 2.5、2.6、2.7。okhttp调用存在一些神秘的问题。当我进行改造时,我的Okhttp拦截器立即被调用,而NetworkInterceptor在4到5秒后被调用。有时超过15秒,并导致SocketTimeoutExcpetion。

请提出建议,我该怎么做才能解决此问题。是否有任何线程阻止我的 call 被执行?

最佳答案

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

请注意,这不会处理异常,如果客户端现在未在x秒内收到响应,则仍然会抛出该异常。我会确保确实捕获到异常。这是拥有重试逻辑的合适位置。

由于您将RxJava与Retrofit一起使用,因此您只需在链中添加 retry/retryWhen 即可捕获和处理SocketTimeoutException错误,甚至可以混入exponential backoff

07-28 01:47
查看更多