2017-08-10 67 views
0

,网络请求在12在下面的代码执行:okhttp - 当使用<code>OkHttp</code>执行()与主体()的字节流

  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

有四个步骤,每个OkHttp电话:

  1. 写请求头
  2. 流请求体,如果它存在
  3. 阅读响应头
  4. 流响应主体

当你调用​​OkHttp做步骤1 - 3还呼吁流响应b ODY。如果您的响应主体很大,这可以让您在响应正在下载时开始解码响应。

+0

感谢@Jesse!这很有道理。两个后续问题,我必须关闭流或okhttp为我做?你推荐哪些资源来更多地了解这个主题。再次感谢 – feresr

+1

是的,总是关闭响应主体。 OkHttp wiki和HTTP规范就是最好的资源。 –