我在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。