内存不足使用Retrofit 2下载文件

Meg*_*gaX 5 java android retrofit

我有一个pdf查看器应用程序,我必须下载大的pdf文件(例如136mb)我正在使用retrofit2-beta2进行此过程.问题是我总是耗尽内存.我如何告诉改装我将下载一个大文件,请给我一个byteStream?

我的界面是:

@GET("url")
Call<ResponseBody> getData(params);
Run Code Online (Sandbox Code Playgroud)

我有一个ProgressResponseBody类,它正在扩展ResponseBody,我在这里设置progressListener,以便能够刷新我的进度条,

onResponse函数中我只是得到了InputStream

InputStream input = response.body().byteStream();
FileOutputStream out = new FileOutputStream(file);
int bufferSize=1024;
byte[] buffer = new byte[bufferSize];
int len = 0;
while (len = input.read(buffer) != -1) {
    out.write(buffer,0,len);
} 
if(out!=null)
    out.close();
Run Code Online (Sandbox Code Playgroud)

UPDATE

我已经加入了@Stream到接口,但现在我得到NetworkOnMainThreadException在ProgressResponseBody.java的误差在super.read(水槽,BYTECOUNT)抛出; 行.我怎么能把它放到一个单独的线程?

@Override
    public BufferedSource source() throws IOException {
        if (bufferedSource == null) {
            bufferedSource = Okio.buffer(source(responseBody.source()));
        }
        return bufferedSource;
    }

    private Source source(Source source) {
        return new ForwardingSource(source) {
            long totalBytesRead = 0L;

            @Override
            public long read(Buffer sink, long byteCount) throws IOException {
                long bytesRead = super.read(sink, byteCount);
                totalBytesRead += bytesRead != -1 ? bytesRead : 0;
                progressListener.update(totalBytesRead, responseBody.contentLength(), bytesRead == -1);
                return bytesRead;
            }
        };
    }
Run Code Online (Sandbox Code Playgroud)

iag*_*een 5

@Streaming注释添加到您的调用中以获取原始数据ResponseBody

@Streaming
@GET("url")
Call<ResponseBody> getData(params);
Run Code Online (Sandbox Code Playgroud)