【问题标题】:okhttp - execute() vs body().byteStreamokhttp - execute() vs body().byteStream
【发布时间】:2018-01-19 03:08:24
【问题描述】:

使用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 在这种情况下是什么意思。

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

【问题讨论】:

    标签: okhttp okhttp3 okio


    【解决方案1】:

    每个 OkHttp 调用有四个步骤:

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

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

    【讨论】:

    • 谢谢@Jesse!这很有意义。两个后续问题,我必须关闭流还是 okhttp 为我做?以及您推荐哪些资源来了解有关此主题的更多信息。再次感谢
    • 是的,总是关闭响应正文。最好的资源是 OkHttp wiki 和 HTTP 规范。
    猜你喜欢
    • 2021-03-27
    • 2020-01-12
    • 1970-01-01
    • 2022-12-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    相关资源
    最近更新 更多