本文为译文,原文在:https://futurestud.io/tutorials/retrofit-2-customize-network-timeouts
okHTTPclient 配置超时时间
默认情况下,Retrofit 的默认超时时间如下:
- Connection timeout: 10 秒
- Read timeout: 10 秒
- Write timeout: 10 秒
- Call timeout: 0 秒 (代表没有超时)
下面我们解释下各个超时时间分别代表什么含义
如何设置超时时间
你应该已经了解到,网络请求超时时间的设置不是在 Retrofit 里面设置的,而是通过对 okHTTPclient 的设置来完成。okHTTPclient 作为 Retrofit 的网络层,设置网络超时时间的代码如下所示:
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(1, TimeUnit.MINUTES)
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(15, TimeUnit.SECONDS)
.callTimeout(2, TimeUnit.MINUTES)
.build();
Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl("http://10.0.2.2:3000/")
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create());
The code above sets the connection timeout to one minute, the read timeout to 30 seconds, and the write timeout to 15 seconds. Of course you don't have to change all three at the same time and can just modify whatever subset you want to modify. Let's look at each timeout in more detail.
以上代码将 connectionTimeout 设置为 1 分钟,readTimeout 设置为 30秒,writeTimeout 设置为 15 秒,callTimeout 设置为 2 分钟。当然如果你不想改变Retrofit 中的某项的默认值,可以不必配置他,也就是说你只需要按照自己的需要配置即可。我们来看下这些 timeout 分别代表什么。
Connection Timeout - 连接超时
connectionTimeout 应该是最有意思的一种超时设置了。 他指的是从客户端发出一个请求开始到客户端与服务器端完成 TCP 的 3 次握手建立连接的这段时间。换句话说,如果 Retrofit 在指定的时间内无法与服务器端建立连接,那么 Retrofit 就认为这次请求失败。
比如,当你的用户可能会在网络状态不佳的情况下与你的服务器进行通信,那么你需要增大这个数字。
Read Timeout - 读取超时
读取超时(readTimeout)指的是这段时间区间:从连接建立成功开始,Retrofit 就会监测每个字节的数据传输的速率。如果其中某自己距离上一字节传输成功的时间大于指定的 readTimeout 了,Retrofit 就会认为这个请求是失败的。这个时间计数器会在读取到每个 byte 之后归零重新开始计时。所以如果你的响应当中有 120 个 bytes 需要传输到客户端,而每个 byte 的传输都需要 5 秒,这种情况下尽管完全传输需要 600 秒,但不会触发 readTimeout(30 秒)error。
另外,readTimeout 的触发不仅限于服务器端的处理能力,也有可能是由于糟糕的网络状态引起。
译者注
:注意这个并不是说在指定的时间(比如 30 秒)内需要把响应内容完全接收,而是指相邻的两个字节之间的接收时间不能超过指定的时间( 30 秒)。
Write Timeout - 写入超时
写入超时(writeTimeout)是跟readTimeout 相对应的反方向的数据传输。他检查的是客户端向服务器端发送数据的速率。当然,跟 readTimeout的计时器类似,每个 byte 发送成功之后这个计时器都会被重置。如果某个byte 的数据传输时间超过了配置的写入超时时间,Retrofit 就会认为这个请求是失败的。
译者注
:注意这个并不是说在指定的时间(比如 15 秒)内需要把所有的数据都发送到服务器端,而是指相邻的两个字节之间的发送时间不能超过指定的时间(15 秒)。
Call Timeout - 请求超时 [译者注]
这部分内容是从这里看到的: https://square.github.io/okhttp/4.x/okhttp/okhttp3/-ok-http-client/-builder/call-timeout/
The call timeout spans the entire call: resolving DNS, connecting, writing the request body, server processing, and reading the response body. If the call requires redirects or retries all must complete within one timeout period.
Call timeout 的计时器横跨整个请求,从 DNS 解析,连接建立,发送数据到服务器,服务器端处理,然后发送响应到客户端,直到客户端完全读取响应内容。如果这个请求需要重定向或重试,这些过程都必须在指定的 callTimeout 时间区间内完成。如果不能完成 Retrofit 就会认为请求失败。
这个 callTimeout 的默认值为 0 代表不考虑请求的超时。
译者注
: 当你的应用内需要限定 App 在某个指定的时间内得到响应结果,如果在指定时间内未能得到就认为是超时的话,那么你应该用callTimeout
.