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();
这些超时设置可以帮助你更好地控制网络请求行为,避免因网络问题导致应用无响应。