OkHttp 提供了四種不同的超時設置,每種針對網絡請求的不同階段:
1. callTimeout (調用超時)
-
作用:控制整個調用從開始到結束的總時間,包括所有重定向和重試
-
默認值:0 (不超時)
-
場景:當你希望限制整個請求的完成時間,無論中間經過多少次重定向或重試
-
設置方法:
OkHttpClient client = new OkHttpClient.Builder() .callTimeout(30, TimeUnit.SECONDS) .build(); //這里設置為0,則永不超時
注:在弱網情況下,博主遇到還沒下載完就判斷為超時,導致下載失敗,這時候需要設置callTimeout時間,可以修復問題
2. connectTimeout (連接超時)
-
作用:控制與目標服務器建立連接的時間
-
默認值:10秒
-
場景:當服務器響應慢或網絡狀況差時,防止長時間等待連接建立
-
設置方法:
OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(15, TimeUnit.SECONDS) .build();
3. readTimeout (讀取超時)
-
作用:控制從服務器讀取數據的間隔時間(兩次數據包之間的時間)
-
默認值:10秒
-
場景:防止服務器響應慢或傳輸大文件時連接被長時間占用
-
設置方法:
OkHttpClient client = new OkHttpClient.Builder() .readTimeout(30, TimeUnit.SECONDS) .build();
4. writeTimeout (寫入超時)
-
作用:控制向服務器發送數據的間隔時間(兩次數據包之間的時間)
-
默認值:10秒
-
場景:防止上傳大文件時由于網絡狀況差導致長時間占用連接
-
設置方法:
OkHttpClient client = new OkHttpClient.Builder() .writeTimeout(30, TimeUnit.SECONDS) .build();
超時設置建議
-
根據網絡環境調整:移動網絡下建議設置較長的超時時間
-
根據請求類型調整:上傳/下載大文件時需要增加讀寫超時
-
優先級關系:callTimeout > connectTimeout + readTimeout + writeTimeout
-
特殊需求:對于關鍵請求可以設置較短的callTimeout,確保快速失敗
示例配置
OkHttpClient client = new OkHttpClient.Builder().callTimeout(60, TimeUnit.SECONDS) // 總超時60秒.connectTimeout(15, TimeUnit.SECONDS) // 連接超時15秒.readTimeout(30, TimeUnit.SECONDS) // 讀取超時30秒.writeTimeout(30, TimeUnit.SECONDS) // 寫入超時30秒.build();
這些超時設置可以幫助你更好地控制網絡請求行為,避免因網絡問題導致應用無響應。