我写了一小段代码,使用OkHttp3
下载文件并通过侦听器报告进度,为此,我使用了食谱here中提供的示例实现。
现在测试一下,我正在使用MockWebServer
,我的问题是,如果MockResponse
主体很小,则不会报告实际进度。为了获得较大的回应,我尝试了两种方法:
具有大于内部缓冲区大小的响应主体:
val bytes = ByteArray(10000)
Random().nextBytes(bytes)
server.enqueue(MockResponse()
.setResponseCode(200)
.setBody(bytes.toByteString().utf8()))
在这种情况下,仅返回一个响应,换句话说,ForwardingSource#read
仅被调用一次。
调用setChunkedBody
,这将使ForwardingSource#read
被调用多次,直到完全读取响应为止:
val bytes = ByteArray(1024)
Random().nextBytes(bytes)
server.enqueue(MockResponse()
.setResponseCode(200)
.setChunkedBody(bytes.toByteString().utf8(), 256))
这里的问题是content-length
为-1,所以无法计算进度。
如何解决?