[英]Handling lists with RxJava and Retrofit in android
我有几个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(friend)
保存每个朋友 现在我是RxJava的新手,不知道如何处理列表。 我看了杰克沃顿的一张幻灯片 ,发现他使用的函数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(...);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.