我使用okhttp库下载android中的文件。下载成功。但是当我暂停并恢复下载时,出现了一些问题。
Response request = new Request.Builder().url(url).build();
ResponseBody responseBody = response.body();
File file = new File(filePath);
BufferedInputStream input = new BufferedInputStream(responseBody.byteStream());
OutputStream output;
if (isResume) {
output = new FileOutputStream(file, true);
input.skip(downloadedSize);
} else {
output = new FileOutputStream(file, false);
}
long totalByteSize = responseBody.contentLength();
byte[] data = new byte[1024];
int count = 0;
while ((count = input.read(data)) != -1) {
downloadedSize += count;
output.write(data, 0, count);
}
问题是,例如,文件大小为10MB。我暂停时,它下载了3MB,然后恢复下载,当下载完成的文件大小成为13MB。它不是从下载的大小开始,而是从字节流的开头开始下载。因此文件变为13MB。代码有什么问题?
3条答案
按热度按时间6uxekuva1#
恢复使用“范围”头与您的请求和附加流已经下载的文件.
yhxst69z2#
根据 Alexandria 回答,我已经尝试了他推荐的两种方法。第一种方法在下载停止时产生错误,然后在应用程序重新启动后继续。我发现第二种方法更稳定。代码中还有一个语法错误。示例代码在这里。
jq6vz3qz3#
第一种方式
我试了很多代码,最后用BufferedSource source = responseBody.source(); source.skip(downloadedSize);
成功了。我觉得我很幸运:)
第二条路
我添加了跳过下载字节的头,它的工作。