как написать вложенный сетевой запрос, используя rxjava + retrofit2

Я использую Rxjava и Retrofit2.0 в своем проекте, это выглядит так:

Observable<List<A>>  getAFromServer();
Observable<List<B>>  getBFromServer(@Body A.a);

Если я не использую реактивный способ, это будет так:

List<A> listA = getAFromServer();
foreach(A a: listA){
        getBFromServer(a.a)
}

Итак, мой вопрос: как использовать Rxjava для достижения этой цели и какой оператор использовать?


person zzq    schedule 29.03.2016    source источник
comment
см. этот вопрос: stackoverflow.com/questions/26356852/   -  person hehe    schedule 29.03.2016
comment
Исправлены вещи и пробелы, связанные с языком.   -  person mentat    schedule 29.03.2016


Ответы (1)


С Rx вы, наконец, можете перестать думать о "вложенных" сетевых запросах.

Если подумать, вы никогда не хотели «вкладывать» сетевые запросы, верно? Так выглядел код только потому, что в вашем распоряжении были только AsyncTask или другие обратные вызовы.

С помощью Rx вы, наконец, можете написать код, который по своей структуре напоминает то, что вы на самом деле хотите, а именно цепные сетевые запросы: сначала сделайте одно, затем сделать другое.

getAFromServer()
    .flatMap(new Func1<List<A>, Observable<A>>() {       
        @Override
        public Observable<A> call(List<A> list) {
            // the first flatMap is just a trick to "flatten" the Observable
            return Observable.from(list);
        }
    })
    .flatMap(new Func1<A, Observable<B>>() {
        @Override
        public Observable<A> call(A someA) {
            return getBFromServer(someA.a);
        }

    })
    .subscribe(...);
person david.mihola    schedule 29.03.2016