Retrofit2 Streaming GET 方法 内存不足错误



我的界面:

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 ,这意味着它必须将整个事情放在缓冲区中。这也是为什么没有报告任何增量进展的原因。

最新更新