我的界面:
public interface Downloader {
@Streaming @GET Call<ResponseBody> get(@Url final String url);
}
我的下载方法:
private void download(final String url, final File zip) throws IOException {
AsyncHelper.assertNotMainThread();
final Call<ResponseBody> call = downloaderInstance.get(url);
final Response<ResponseBody> response = call.execute();
if (!response.isSuccessful()) {
downloadFailed(response.code());
return;
}
final ResponseBody body = response.body();
downloadedBytes = 0;
totalBytes = body.contentLength();
final InputStream in;
final OutputStream fout;
in = body().byteStream();
fout = new FileOutputStream(zip);
int read;
while ((read = in.read(BUFFER)) != -1) {
fout.write(BUFFER, 0, read);
downloadedBytes += read;
LOG.d("wrote %d bytes (total: %d)", downloadedBytes, totalBytes);
}
body.close();
fout.close();
}
整个事情在后台线程上运行,我在日志中没有收到任何带有"写入 x 字节(总计:y)"的日志行,这告诉我它没有流式传输。
在之前的实现中,我将此流直接运行到一个ZipInputStream
中以动态解压缩,我将该过程分为下载和解压缩步骤,认为ZipInputStream
可能是问题所在。该过程在下载过程中失败,这意味着一旦我修复了此问题,我就可以恢复以即时解压缩。
我做错了什么?
我也尝试过final InputStream in = response.body().source().inputStream();
相同的结果。我也尝试了enqueue
而不是execute
相同的结果。
所以,这很尴尬,但我会把它留在这里,以防其他人遇到类似的情况。
我的问题的答案是:"没有"。我做的一切都是对的。至少根据上面的代码。
我做错的是,出于调试目的,我将日志记录级别设置为 BODY
,这意味着它必须将整个事情放在缓冲区中。这也是为什么没有报告任何增量进展的原因。