2015-12-21 68 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。所以,我不確定這是什麼問題。你有沒有遇到過這樣的問題?我的用戶也面臨同樣的問題。 –