Я загружаю PDF-файл с модифицированной версией, способ, которым я загружаю его по блокам. Я использую заголовок Content-Range
, чтобы получить диапазон байтов, тогда мне нужно записать эти байты на file
, проблема в том, чтобы написать их. Я использую функцию flatMap()
для возврата наблюдаемого для каждого запроса, который должен быть выполнен для загрузки файла.Загрузите и напишите файл с Retrofit и RxJava
.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);
}
})
The 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' http://fernandocejas.com/2015/01/11/rxjava-observable-tranformation-concatmap-vs-flatmap/ –
В качестве альтернативы, используйте RandomAccessFile и запись в тот же файл смещения запрос был сделан. – akarnokd
Вы должны использовать DownloadManager для загрузки большого содержимого. http://developer.android.com/reference/android/app/DownloadManager.html –