okhttp - execute() 与 body().byteStream
okhttp - execute() vs body().byteStream
使用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)
被处死的,这样的话问问是否响应成功才有意义。但是今天我决定实施 this official recipe 来跟踪正在下载的文件的进度。
然后我意识到,如果我删除行 (response.body().byteStream()
),进度计数器根本不会移动。理论上,我们没有下载任何东西,除非我们正在下载否则 success
在这种情况下意味着什么。
如果这是一个虚拟问题,我很抱歉,我相信我在这里遗漏了一些关于网络的非常基础的东西,我想了解更多。
我试图了解 Okio
库的源代码,但它对我来说有点太复杂了,我需要一些参考或指导。
每个 OkHttp 调用有四个步骤:
- 写请求headers
- 流式传输请求 body,如果存在
- 阅读回复headers
- 流式传输响应 body
当您调用 execute()
时,OkHttp 会执行步骤 1 – 3。进一步的调用会流式传输响应 body。如果您的响应 body 很大,您可以在响应仍在下载时开始对其进行解码。
使用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)
被处死的,这样的话问问是否响应成功才有意义。但是今天我决定实施 this official recipe 来跟踪正在下载的文件的进度。
然后我意识到,如果我删除行 (response.body().byteStream()
),进度计数器根本不会移动。理论上,我们没有下载任何东西,除非我们正在下载否则 success
在这种情况下意味着什么。
如果这是一个虚拟问题,我很抱歉,我相信我在这里遗漏了一些关于网络的非常基础的东西,我想了解更多。
我试图了解 Okio
库的源代码,但它对我来说有点太复杂了,我需要一些参考或指导。
每个 OkHttp 调用有四个步骤:
- 写请求headers
- 流式传输请求 body,如果存在
- 阅读回复headers
- 流式传输响应 body
当您调用 execute()
时,OkHttp 会执行步骤 1 – 3。进一步的调用会流式传输响应 body。如果您的响应 body 很大,您可以在响应仍在下载时开始对其进行解码。