Baixe e escreva um arquivo com Retrofit e RxJava
Estou baixando um arquivo pdf com modernização, do jeito que estou baixando é em blocos. Eu uso oContent-Range
cabeçalho para obter um intervalo de bytes, então eu preciso escrever esses bytes em umfile
o problema é a ordem de escrevê-los. Estou usando oflatMap()
para retornar um observável para cada solicitação que deve ser feita para baixar o arquivo.
.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);
}
})
odownloadPDFBlock
receba uma string que é necessária por um cabeçalho:Range: bytes=0-3999
. Então eu uso a função de inscrição para escrever os bytes baixados
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);
}
}
});
Mas o problema é que o processo de escrita é desordenado. Por exemplo: se oRange: bytes=44959-53151
for baixado primeiro, esses serão os bytes que serão gravados primeiro no arquivo. Eu li sobreBlockingObserver
mas não sei se isso poderia ser uma solução.
Eu espero que você possa me ajudar.