【发布时间】:2015-09-16 13:44:12
【问题描述】:
我正在下载一个带有改造的 pdf 文件,我下载它的方式是按块下载。我使用Content-Range 标头来获取一系列字节,然后我需要将这些字节写入file 问题是写入它们的顺序。我正在使用 flatMap() 函数为下载文件必须完成的每个请求返回一个 observable。
.flatMap(new Func1<Integer, Observable<Response>>() {
@Override
public Observable<Response> call(Integer offset) {
int end;
if (offset + BLOCK_SIZE > (contentLength - 1))
end = (int) contentLength - 1 - offset;
else
end = offset + BLOCK_SIZE;
String range = getResources().getString(R.string.range_format, offset, end);
return ApiAdapter.getApiService().downloadPDFBlock(range);
}
})
downloadPDFBlock 接收标头所需的字符串:Range: bytes=0-3999。然后我使用订阅函数来写入下载的字节
subscribe(new Subscriber<Response>() {
@Override
public void onCompleted() {
Log.i(LOG_TAG, file.getAbsolutePath());
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(Response response) {
writeInCache(response);
}
}
});
但问题是编写过程是无序的。例如:如果首先下载Range: bytes=44959-53151,则这些字节将首先写入文件中。我已经阅读了关于BlockingObserver 的信息,但我不知道这是否是一个解决方案。
希望你能帮助我。
【问题讨论】:
-
检查
concatMap运营商fernandocejas.com/2015/01/11/… -
或者,使用 RandomAccessFile 并写入请求所针对的同一文件偏移量。
-
您应该使用 DownloadManager 来加载大型内容。 developer.android.com/reference/android/app/…
-
@RalphBergmann 我需要分块下载,因为我正在使用 MuPDF 流式传输 PDF。因此,在下载文件时,我会在阅读器中显示页面。
标签: java android file-io retrofit rx-java