微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用RxJava和Retrofit处理列表

我有几个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 举报,一经查实,本站将立刻删除。

相关推荐