【发布时间】:2017-09-07 05:35:10
【问题描述】:
我使用 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。代码有什么问题?
【问题讨论】:
-
您正在创建一个新请求并发送它。这会导致响应保存整个文件。我不确定 okHttp 是否有能力下载部分响应,但如果有,那不是你的做法。您至少必须传入一些关于从何处开始下载的数据。
-
我认为您的方法没有任何问题,可能是您的下载大小为 0,而这又不跳过任何内容。我真的没有发现问题和第一种方式描述的答案之间有任何区别。如果有任何具体区别,请告诉我
-
@Killer 的区别是 source.skip(downloadedSize) 。您看不到的代码我从 db 获取文件下载状态和下载大小。例如文件大小为 5.5mb,我在过去的下载过程中下载了 3mb。下一个下载过程必须调用source.skip(3mb to bytes)
标签: android download okhttp bytestream