Mam listę plików, które chciałbym przesłać do backendu z urządzenia z systemem Android. Z powodu ograniczeń pamięci chciałbym wykonać drugie wywołanie API tylko po pierwszym zakończeniu, trzecim po drugim zakończeniu i tak dalej.Wykonywanie N sekwencyjnych wywołań api za pomocą RxJava i Retrofit
pisałem coś
private Observable<Integer> uploadFiles(List<File> files) {
return Observable.create(subscriber -> {
for (int i = 0, size = files.size(); i < size; i++) {
UploadModel uploadModel = new UploadModel(files.get(0));
int uploadResult = retrofitApi.uploadSynchronously(uploadModel);
subscriber.onNext(uploadResult);
}
subscriber.onCompleted();
}).subscribeOn(Schedulers.newThread());
}
Ale czuję się jak to może być wbrew duchowi Rx, a powiedzenie jest, jeśli używasz Observable.create, jesteś prawdopodobnie robi to źle. .. Czy to rozsądne podejście? Czy jest lepszy sposób na osiągnięcie tego dzięki integracji RxJava Retrofit?
Dlaczego nie zdefiniować w interfejsie API 'uploadSynchronically' na ** not ** return Observable? Innym sposobem jest użycie do blokowania na każdym obserwowalnym. – marwinXXII
Tak właśnie zrobiłem - retrofitApi.uploadSynchronously to blokujące połączenie modernizacyjne, które zwraca int, a nie observing. A jeśli twoje pytanie brzmi, dlaczego nie zrobiłem prostej pętli bez Rx, cóż, byłoby to trudne w obsłudze błędów i aktualizacji postępów UI elegancko, plus jest kilka dodatkowych kroków przed i po tym obserwowalnym w łańcuchu. –
Właściwie to nie, wydaje mi się, że podstawowa pętla jest tu lepsza niż użycie 'map'. – marwinXXII