okhttp - execute()vs body()。byteStream

时间:2017-08-10 18:22:47

标签: okhttp okhttp3 okio

使用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库的源代码,但这对我来说有点过于复杂,我需要一些参考或指导。

1 个答案:

答案 0 :(得分:1)

每个OkHttp调用都有四个步骤:

  1. 撰写请求标题
  2. 流式传输请求正文(如果存在)
  3. 阅读回复标题
  4. 流式传输响应正文
  5. 当您致电execute()时,OkHttp执行步骤1 - 3.进一步调用流式传输响应正文。如果您的响应正文很大,则允许您在响应仍在下载时开始解码。