0

使用OkHttp时,网络请求在以下代码中1或中执行:2

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

我一直以为我被处决了(1),在这种情况下,询问响应是否成功是有意义的。但是今天我决定实现这个官方秘籍来跟踪正在下载的文件的进度。

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

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

4

1 回答 1

3

每个 OkHttp 调用有四个步骤:

  1. 编写请求标头
  2. 流式传输请求正文(如果存在)
  3. 读取响应标头
  4. 流式传输响应正文

当您调用execute()OkHttp 时,会执行步骤 1 - 3。进一步调用流式处理响应正文。如果您的响应正文很大,这允许您在响应仍在下载时开始对其进行解码。

于 2017-08-10T22:53:23.353 回答