Страницы

Поиск по вопросам

суббота, 11 января 2020 г.

Как выполнить более 3 параллельных http запросов с помощью RxJava (+retrofit2) в Android

#android #kotlin #rxjava #retrofit2


Пытаюсь освоить работу с RxJava + retrofit2 + kotlin.

Как в этом участвует Observable в общем разобрался, даже научился объединять результаты
2-3 параллельных запросов по итогу выполнения всех с помощью Observable.zip, НО как
похожим образом выполнить более 3 параллельных запросов не могу понять.

В исходном коде класса Observable есть метод 

static  Observable zip(), 


но он не работает как 

static  Observable zip() 


в случае с тремя Observable на вход и Function3<*,*,*,*>. 

Старался уже сделать первые три запроса с помощью zip, потом flatMap и тд, но всё
не выходит. Чтение документации и примеров не помогают повернуть к нужному направлению.
Смотрел в сторону Observable.combineLatest, но пришел к выводу (может ошибочному),
что метод вернет результат первого выполнившегося Observable.

Если в целом, что я хочу: 

У меня есть 4 метода, которые возвращают Observable:


this.orderRepository.getStatuses():Observable
this.orderRepository.getOrders():Observable
this.userRepository.getUsers():Observable
this.orderRepository.getTypes():Observable


Подскажите, пожалуйста, как я должен скомпоновать эти методы, чтобы они выполнились
параллельно, и в конце получить результат выполнения всех 4 методов в одном месте? 

Мои стыдливые попытки ниже. Это уже что-то испорченное, но я вообще не понимаю, что
я должен сделать с 4 Observables, чтобы их всех в одном месте и вернуть в UI. + уже
запутался с flatMap, map и так далее...

override fun buildUseCaseObservable(params: Params): Observable {

return Observable.zip(
                this.userRepository.getUsers(100, 1, ApiUserFilter(isManager = true)),
                this.orderRepository.getOrderStatuses(),
                this.orderRepository.getOrderTypes(),
                Function3
{ t1, t2, t3 ->
                    Zip(t1,t2,t3)
                }).map {
                    this.orderRepository.getOrders(params.limit, params.page, params.filter).flatMap {
                        it
                    }
                }

 }



    


Ответы

Ответ 1



Zip для четырех observable можно написать так: Observable.zip( getStatuses(), getOrders(), getUsers(), getTypes(), Function4 { status, order, user, type -> ... } )

Комментариев нет:

Отправить комментарий