我有几个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(...);
原文地址:https://www.jb51.cc/java/123923.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。