okhttp - execute() 与 body().byteStream

okhttp - execute() vs body().byteStream

使用OkHttp时,网络请求在12中执行,代码如下:

            val response = client.newCall(request).execute() // (1)
            if (response.isSuccessful) {
                val bs = response.body().byteStream() // (2)
                val bitmap = BitmapFactory.decodeStream(bs)
            } else { ... }

我一直以为我是在(1)被处死的,这样的话问问是否响应成功才有意义。但是今天我决定实施 this official recipe 来跟踪正在下载的文件的进度。

然后我意识到,如果我删除行 (response.body().byteStream()),进度计数器根本不会移动。理论上,我们没有下载任何东西,除非我们正在下载否则 success 在这种情况下意味着什么。

如果这是一个虚拟问题,我很抱歉,我相信我在这里遗漏了一些关于网络的非常基础的东西,我想了解更多。 我试图了解 Okio 库的源代码,但它对我来说有点太复杂了,我需要一些参考或指导。

每个 OkHttp 调用有四个步骤:

  1. 写请求headers
  2. 流式传输请求 body,如果存在
  3. 阅读回复headers
  4. 流式传输响应 body

当您调用 execute() 时,OkHttp 会执行步骤 1 – 3。进一步的调用会流式传输响应 body。如果您的响应 body 很大,您可以在响应仍在下载时开始对其进行解码。