1 分钟搞懂Retrofit 里的各种timeout分别都代表什么

本文为译文,原文在: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.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345