Pobierany jest plik pdf z doposażeniem, sposób, w jaki go pobieraj, jest blokowany. Używam nagłówka Content-Range
, aby uzyskać zakres bajtów, a następnie muszę zapisać te bajty na file
problemem jest kolejność ich zapisywania. Używam funkcji flatMap()
, aby zwrócić obserwowalne dla każdego żądania, które należy wykonać, aby pobrać plik.Pobierz i napisz plik z Retrofit i 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
otrzymywać e struny, która jest potrzebne nagłówka: Range: bytes=0-3999
. Następnie używam funkcji subskrypcji do zapisywania bajtów pobranych:
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);
}
}
});
Problem polega na tym, że proces pisania został nieuporządkowany. Na przykład: jeśli najpierw pobierze się Range: bytes=44959-53151
, będą to bajty, które zostaną zapisane jako pierwsze w pliku. Przeczytałem o BlockingObserver
, ale nie wiem, czy to może być rozwiązanie.
Mam nadzieję, że możesz mi pomóc.
Sprawdź 'operator concatMap' http://fernandocejas.com/2015/01/11/rxjava-observable-tranformation-concatmap-vs-flatmap/ –
Ewentualnie użyć RandomAccessFile i pisać w tym samym pliku offsetowego wniosek został złożony dla. – akarnokd
Należy użyć narzędzia DownloadManager do ładowania dużej zawartości. http://developer.android.com/reference/android/app/DownloadManager.html –