我有几个api调用(顺序地,异步地),其中一些返回列表.我的api界面如下.
@GET("/users/settings") Observable<UserWrapper> getUserSettings(); @GET("/{username}/collections") Observable<List<Item>> getItems(@Path("username") String userName); @GET("/item/{id}") Observable<ItemInfo> getItemInfo(@Path("id") int id); @GET("/{username}/friends") Observable<List<Friend>> getFriends(@Path("username") String userName);
以下是我要做的顺序:
>通过调用getUserSettings()获取UserWrapper
>通过调用saveUser(userWrapper)保存用户
>通过调用getItems(userWrapper.getUserName())获取用户的项目
>通过调用getItemInfo(item.getId())获取每个项目的信息
>通过调用saveItem(itemInfo)保存每个itemInfo
>通过调用getFriends(userWrapper.getUserName())获取用户的朋友
通过调用saveFriend(朋友)来保存每个朋友
现在我是RxJava的新手,不知道如何处理列表.我看了一个Jake Wharton’s slides,发现他使用一个函数flattenList(),但我不知道它的定义.如果您可以帮助组合这个链接,那将是巨大的.
更新1
这是我现在已经到了
mApiService.getUserSettings() .map(this::saveUser) .flatMap(userWrapper -> mApiService.getItems(userWrapper.getUserName())); .flatMapIterable( ? "How to iterate for each item" ? );
更新2
我想写这样的东西
mApiService.getUserSettings() .map(this::saveUser) .flatMap(userWrapper -> mApiService.getItems(userWrapper.getUserName())) .someMethodToIterateThroughEachItem(item -> mApiService.getItemInfo(item)) .map(this::saveItem) .someMethodThatCanCallUserWrapperAgain(userWrapper -> mApiService.getFriends(userWrapper.getUserName())) .someMethodToIterateThoughEachFriend(friend -> saveFriend(friend))
解决方法
RxJava已经添加了flatMapIterable.所以你现在不需要flattenList例如.,
Observable<UserWrapper> o = getUserSettings() .doOnNext(this::saveUser) .flatMap(user -> getItems(user.getUserName()) .flatMapIterable(items -> items) .flatMap(item -> getItemInfo(item.getId())) .doOnNext(this::saveItem) .toList() .map(ignored -> user)) .flatMap(user -> getFriends(user.getUserName()) .flatMapIterable(friends -> friends) .doOnNext(this::saveFriend) .toList() .map(ignored -> user) ); o.subscribe(...);