如何编写嵌套网络请求使用rxjava + retrofit2

zzq*_*zzq 2 android rx-java retrofit2

我在我的项目中使用Rxjava和Retrofit2.0,它看起来像这样:

Observable<List<A>>  getAFromServer();
Observable<List<B>>  getBFromServer(@Body A.a);
Run Code Online (Sandbox Code Playgroud)

如果我不使用反应方式,它将是这样的:

List<A> listA = getAFromServer();
foreach(A a: listA){
        getBFromServer(a.a)
}
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是如何使用Rxjava来实现这个以及使用什么运算符?

dav*_*ola 8

使用Rx,您最终可以不再考虑"嵌套"网络请求.

如果你考虑一下,你真的不想"嵌套"网络请求,对吧?这只是代码最终看起来的样子,因为你只有AsyncTasks或其他回调可供你使用.

使用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(...);
Run Code Online (Sandbox Code Playgroud)